2012-07-25 77 views
0

我正在使用CASE命令将子字符串查询结果从一个数字更改为名称。SQL Server CASE函数仅返回字符串中的第一个值

事情似乎很好,但我很难找出为什么结果只显示字符串的第一个值。

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%' 

当代码运行它创建标题Manual Overrides列这是正确的,在该列中它显示的字符串中的第一个值。但是,字符串中其他四个值的结果在哪里。任何援助或想法将不胜感激。

谢谢。

+5

CASE不是一个语句,它是一个返回单个值的表达式。它永远不会从你的字符串中返回2个或更多的值。你可以展示一个简化版本的数据和期望的结果吗? – 2012-07-25 20:48:01

+0

为什么不创建ManualOverrides表,以便每次获取新表时不必修改此查询? – Bert 2012-07-25 20:51:40

+0

你需要连接在同一行还是四行不同的值吗? – Lamak 2012-07-25 20:54:05

回答

1

怎么是这样的:

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

谢谢@RedFilter这完全按照我的计划工作。 99%在这里完成,现在我必须将where子句更改为仅显示“In Override”中的行。再次感谢!! – Kris 2012-07-26 07:50:20

0

你是否真的需要这些笨重的变量来表示1和0?真?无论如何,真的在猜测你想要在这里输出什么。也许这样的:

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%'; 

或者,也许你只是想看看实际上是在覆盖的值:也许你想单独列毕竟

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%'; 

或者:

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%'; 

也许完全不同的东西。如果我们无法看到源数据或您想要的结果,那么填写您写入的查询与您想要的结果之间的差距是很困难的。

+0

这也适用。谢谢... – Kris 2012-07-26 07:45:37