0

次の @temp テーブルがあります。

SELECT * 
FROM @temp
WHERE LinkingID = 1

------------------------------------------------------------------
|Condition_ID   LinkingID   Operator   Variable1    Variable2    |
|     1             1          ==        25             2        |
|     2             1          <>        3              7        |
|     3             1          ==        4              4        |
------------------------------------------------------------------

Variable1 Variable2CASEが trueかどうかをチェックする ( ??? )を実装し、すべての行をチェックし、すべての行が true の場合は何かを実行し、そうでない場合は中断して中止します。 OPERATOR

私はこのようなことを考えていました(T-SQLでこれを表現する方法がわからないので、疑似言語を使用します):

CASE 
    WHEN Operator LIKE '=='
        THEN IF Variable1 == Variable2 THEN TRUE
        ELSE THEN FALSE
    WHEN Operator LIKE '<>'
        THEN IF Variable1  <> Variable2 THEN TRUE
        ELSE THEN FALSE
FROM @temp

この結果がすべての行で true の場合は何かを行い、そうでない場合は別のことを行います

上記のシナリオでは、
Row1 が返され、Row2 が返され、 FALSE
Row3 がTRUE
返されます。TRUE

したがって、結果はFALSEです。

4

3 に答える 3

2

テーブル全体の比較結果の蓄積

テーブル全体がすべての行に対して true を返すことを確認することは、false のものをカウントし、その数が 0 より大きいかどうかを確認するのに最適です。0 の場合は、すべての行が一致したことを意味します。それ以外の場合、数字は失敗した行の数を示します。

マイナスをキャッチするために、値と比較した反転比較に注意してください。Operator

declare @NonMatched int

select
    @NonMatched = sum(
        case
            when [Operator] = '==' and Variable1 <> Variable2 then 1
            when [Operator] = '<>' and Variable1 = Variable2 then 1
            else 0
        end
    )
from @temp
where LinkingID = 1

if @NonMatched = 0
begin
    -- execute your stored procedure or whatever else set of statements
end

こちらも上位コードに基づくSQLFiddleです。

于 2012-11-27T11:27:10.183 に答える
1

私は四肢に出て、条件が真と評価されるすべての行で何かをしようとしていると推測します。variable 1 [operator] variable2これは、それらを選択することも削除することもできますが、実際には違いはありません。

例として select を使用します。

SELECT * 
FROM @temp
WHERE LinkingID = 1
AND CASE Operator
    WHEN '==' THEN Variable1 = Variable2
    WHEN '<>' THEN Variable1 <> Variable2
END

これらのレコードを削除する場合は、同じ where 句を使用できます。

編集このセットを集約して、特定のLinkingID評価のすべての条件が true の場合に何かを行うには、次のようなものが機能します。

IF EXISTS(
  SELECT LinkingID FROM temp
  WHERE LinkingID = 1
  GROUP BY LinkingId
  HAVING SUM(CASE 
    WHEN Operator = '==' AND Variable1 = Variable2 THEN 1 
    WHEN Operator = '<>' AND Variable1 <> Variable2  THEN 1
    ELSE 0
  END) = count(*)
)
BEGIN
  -- Do something
END

ここで遊ぶライブの例: http://www.sqlfiddle.com/#!6/26d72/6 その例では、すべての条件が真である LinkingID=2 を設定しました。メッセージを表示するには、LinkingId=1をに変更します。=2do something

于 2012-11-27T11:33:23.390 に答える
0

私は次のように書きます:

SELECT 
    CASE WHEN NOT EXISTS
           ( SELECT *
             FROM @temp
             WHERE LinkingID = 1
               AND NOT ( Operator = '=='  AND  Variable1 = Variable2
                      OR Operator = '<>'  AND  Variable1  <> Variable2
                       )
           ) THEN 'TRUE' 
             ELSE 'FALSE'
     END AS Result ;
于 2012-11-27T11:53:40.810 に答える