0

我正在使用该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为正确的列,在该列中显示字符串中的第一个值。但是,字符串中其他四个值的结果在哪里。任何帮助或想法将不胜感激。

谢谢。

4

2 回答 2

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%'
于 2012-07-25T20:55:34.340 回答
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%';

或者可能是完全不同的东西。如果我们看不到源数据或您想要的结果,就很难弥合您编写的查询与您想要的结果之间的差距。

于 2012-07-25T20:56:32.657 回答