2012-07-25 1 views
0

J'utilise la commande CASE pour simplement modifier un résultat de requête de sous-chaîne d'un nombre à un nom. Les choses semblent bien fonctionner mais j'ai du mal à comprendre pourquoi les résultats affichent uniquement la première valeur de la chaîne.La fonction CASE de SQL Server ne renvoie que la première valeur dans la chaîne

Declare @OverrideON INT, @OverrideOFF INT 
SET @OverrideON = 1 SET @OverrideOFF = 0 

SELECT LonDeviceName, 
CASE WHEN SUBSTRING (PointValue,65,1) = @OverrideON THEN 'Fan In Override' 
     WHEN SUBSTRING (PointValue,67,1) = @OverrideON THEN 'HW In Override'  
     WHEN SUBSTRING (PointValue,69,1) = @OverrideON THEN 'CHW In Override' 
     WHEN SUBSTRING (PointValue,71,1) = @OverrideON THEN 'OAD In Override' 
     WHEN SUBSTRING (PointValue,73,1) = @OverrideON THEN 'VFD In Override' 
     WHEN SUBSTRING (PointValue,65,1) = @OverrideOFF THEN 'Fan Normal' 
     WHEN SUBSTRING (PointValue,67,1) = @OverrideOFF THEN 'HW Normal'  
     WHEN SUBSTRING (PointValue,69,1) = @OverrideOFF THEN 'CHW Normal' 
     WHEN SUBSTRING (PointValue,71,1) = @OverrideOFF THEN 'OAD Normal' 
     WHEN SUBSTRING (PointValue,73,1) = @OverrideOFF THEN 'VFD Normal' 
     ELSE '**StringError**' 
END as 'Manual Overrides' 
FROM dbo.Points 
WHERE LogicName like '%override%' 

Lorsque le code est exécuté, il crée une colonne intitulée Manual Overrides qui est correct, en ce que la colonne elle affiche la première valeur dans la chaîne. Mais, où sont les résultats pour les quatre autres valeurs dans la chaîne. Toute aide ou idée serait grandement appréciée.

Merci.

+5

CASE n'est pas une instruction, c'est une expression qui retourne une seule valeur. Il ne renverra jamais 2 valeurs ou plus à partir de votre chaîne. Pouvez-vous afficher une version simplifiée de vos données et les résultats souhaités? –

+0

Pourquoi ne pas créer une table ManualOverrides pour ne pas avoir à modifier cette requête chaque fois que vous en obtenez une nouvelle? – Bert

+0

Auriez-vous besoin des valeurs concaténées sur la même ligne ou sur quatre lignes différentes? – Lamak

Répondre

1

Que diriez-vous quelque chose comme ceci:

SELECT LonDeviceName, 
    CASE WHEN SUBSTRING (PointValue,65,1) = @OverrideON THEN 'In Override' 
      WHEN SUBSTRING (PointValue,65,1) = @OverrideOFF THEN 'Normal' 
      ELSE '**StringError**' 
    END as 'Fan', 
    CASE WHEN SUBSTRING (PointValue,67,1) = @OverrideON THEN 'In Override' 
      WHEN SUBSTRING (PointValue,67,1) = @OverrideOFF THEN 'Normal' 
      ELSE '**StringError**' 
    END as 'HW', 
    CASE WHEN SUBSTRING (PointValue,69,1) = @OverrideON THEN 'In Override' 
      WHEN SUBSTRING (PointValue,69,1) = @OverrideOFF THEN 'Normal' 
      ELSE '**StringError**' 
    END as 'CHW', 
    CASE WHEN SUBSTRING (PointValue,71,1) = @OverrideON THEN 'In Override' 
      WHEN SUBSTRING (PointValue,71,1) = @OverrideOFF THEN 'Normal' 
      ELSE '**StringError**' 
    END as 'OAD', 
    CASE WHEN SUBSTRING (PointValue,73,1) = @OverrideON THEN 'In Override' 
      WHEN SUBSTRING (PointValue,73,1) = @OverrideOFF THEN 'Normal' 
      ELSE '**StringError**' 
    END as 'VFD' 
FROM dbo.Points 
WHERE LogicName like '%override%' 
+0

Merci @RedFilter Cela fonctionne exactement comme je l'avais prévu. 99% fait ici, maintenant je dois changer cette clause where pour afficher uniquement les lignes 'In Override'. Merci encore!! – Kris

0

Avez-vous vraiment besoin de ces variables volumineux pour représenter 1 et 0? Vraiment? Quoi qu'il en soit, vraiment deviner ce que vous voulez pour la sortie ici. Peut-être ceci:

SELECT LonDeviceName, [Manual Overrides] = '' 
    + 'Fan ' + CASE SUBSTRING (PointValue,65,1) 
       WHEN '1' THEN 'In Override' ELSE 'Normal' END 
    + ',HW ' + CASE SUBSTRING (PointValue,67,1) 
       WHEN '1' THEN 'In Override' ELSE 'Normal' END 
    + ',CHW ' + CASE SUBSTRING (PointValue,69,1) 
       WHEN '1' THEN 'In Override' ELSE 'Normal' END 
    + ',OAD ' + CASE SUBSTRING (PointValue,71,1) 
       WHEN '1' THEN 'In Override' ELSE 'Normal' END 
    + ',VFD ' + CASE SUBSTRING (PointValue,73,1) 
       WHEN '1' THEN 'In Override' ELSE 'Normal' END 
FROM dbo.Points 
WHERE LogicName LIKE '%override%'; 

Ou peut-être que vous voulez voir seulement les valeurs qui sont en fait en remplacement:

SELECT LonDeviceName, [Manual Overrides] = '' 
    + 'Fan ' + CASE SUBSTRING (PointValue,65,1) 
       WHEN '1' THEN 'In Override' ELSE '' END 
    + ',HW ' + CASE SUBSTRING (PointValue,67,1) 
       WHEN '1' THEN 'In Override' ELSE '' END 
    + ',CHW ' + CASE SUBSTRING (PointValue,69,1) 
       WHEN '1' THEN 'In Override' ELSE '' END 
    + ',OAD ' + CASE SUBSTRING (PointValue,71,1) 
       WHEN '1' THEN 'In Override' ELSE '' END 
    + ',VFD ' + CASE SUBSTRING (PointValue,73,1) 
       WHEN '1' THEN 'In Override' ELSE '' END 
FROM dbo.Points 
WHERE LogicName LIKE '%override%'; 

Ou vous voulez peut-être des colonnes séparées après tout:

SELECT LonDeviceName, 
    + [Fan] = CASE SUBSTRING (PointValue,65,1) 
       WHEN '1' THEN 'In Override' ELSE 'Normal' END 
    + [HW] = CASE SUBSTRING (PointValue,67,1) 
       WHEN '1' THEN 'In Override' ELSE 'Normal' END 
    + [CHW] = CASE SUBSTRING (PointValue,69,1) 
       WHEN '1' THEN 'In Override' ELSE 'Normal' END 
    + [OAD] = CASE SUBSTRING (PointValue,71,1) 
       WHEN '1' THEN 'In Override' ELSE 'Normal' END 
    + [VFD] = CASE SUBSTRING (PointValue,73,1) 
       WHEN '1' THEN 'In Override' ELSE 'Normal' END 
FROM dbo.Points 
WHERE LogicName LIKE '%override%'; 

Ou peut-être quelque chose de différent entièrement. Il est difficile de combler l'écart entre la requête que vous avez écrite et les résultats que vous souhaitez obtenir si nous ne pouvons pas voir les données sources ou les résultats souhaités.

+0

Cela fonctionne aussi. Merci... – Kris

Questions connexes