我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] 删除。
我来说两句