检查WHERE子句中的条件

桑托什·苏。

WHERE在XML映射中处于动态条件以下,但工作正常:

WHERE
    IncomingFlightId=#{flightId}
    <if test="screenFunction == 'MAIL'.toString()">
        and ContentCode = 'M'
    </if>
    <if test="screenFunction == 'CARGO'.toString()">
        and ContentCode Not IN('M')
    </if>
    order by ContentCode ASC

我正在尝试在IDE中的查询下运行,但不幸的是它无法正常工作。

有人可以解释我在做什么错吗?

WHERE
   IncomingFlightId = 2568648 
   AND (IF 'MAIL' = 'MAIL'
   BEGIN
        SELECT 'and ContentCode = "M"'
   END ELSE BEGIN
        SELECT 'and ContentCode Not IN("M")'
   END)
   order by ContentCode ASC
凯斯·贾德

您不能在直接SQL语句中使用IF,而应使用IF CASE WHEN test THEN returniftrue ELSE valueiffalse END(如果必须使用条件逻辑)

也就是说,如果您执行以下操作,则可以避免:

WHERE
  (somecolumn = 'MAIL' AND ContentCode = 'M') OR
  (somecolumn <> 'MAIL' and ContentCode <> 'M')

直接SQL中的条件逻辑示例:

SELECT * FROM table
WHERE
  CASE WHEN col > 0 THEN 1 ELSE 0 END = 1

运行测试并返回值的情况。您始终必须将返回值与其他值进行比较。您不能做不返回值的事情。

但是,这有点愚蠢,因为您可以直接在where子句的事实中更简单,更易于理解地表达案件时的真实性。

SELECT * FROM table
WHERE
  CASE WHEN type = 'x'
    THEN (SELECT count(*) FROM x) 
    ELSE (SELECT count(*) FROM y) 
  END = 1

SELECT * FROM table
WHERE
  (type = 'x' AND (SELECT count(*) FROM x) = 1) OR
   type <> 'x' AND (SELECT count(*) FROM y) = 1)  

不过,它对于这样的事情很有用:

SELECT 
  bustourname, 
  SUM(CASE WHEN age > 60 THEN 1 ELSE 0 END) as count_of_old_people
FROM table 
GROUP BY bustourname

如果您想编写一个有条件地构建SQL的存储过程,那么可以肯定的是,您可以...

DECLARE @sql VARCAHR(max) = 'SELECT * FROM TABLE WHERE';
IF blah SET @sql = CONCAT(@sql, 'somecolumn = 1')
IF otherblah SET @sql = CONCAT(@sql, 'othercolumn = 1')
EXEC @sql...

但这仅在存储过程或类似于过程的sql脚本中,在此过程中,它会构建一个看起来像SQL的字符串,然后动态执行它。您不能在普通的SELECT语句中使用IF

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章