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

我想实现一个CASE( ??? ),它将检查Variable1 OPERATOR Variable2是否为真,检查所有行,如果所有行都为真,则执行某些操作,否则中断并中止。

我在想这样的事情(我不确定如何在 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

如果所有行的结果都为真,那么做一些事情,否则做其他事情

在上面的场景中:
Row1 将返回 Row2 将FALSE
返回TRUE
Row3 将返回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评估为真时做某事,这样的事情将起作用:

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=2以查看do 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 回答