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つの値の結果はどこにありますか。任意の支援やアイデアをいただければ幸いです。

ありがとう。

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 に答える