CASE SQL 语句不正确

Posted

技术标签:

【中文标题】CASE SQL 语句不正确【英文标题】:Incorrect CASE SQL statement 【发布时间】:2021-04-30 09:29:52 【问题描述】:

我编写了一条返回无效字符的 SQL 语句。我知道这与我在哪里的案例陈述有关,所以任何人都可以告诉我错误。谢谢。

    WHERE
    <if test="gNumber != null">
        dph.GNUMBER = #gNumber
    </if>
    <if test="licence != null">
        dph.dlicenceNumber = #licence
    </if>
    AND dph.REASON = (CASE WHEN dph.REASON IS NOT NULL THEN par.CODE END)

【问题讨论】:

SQL 语法中是否允许这种标记?我不这么认为...... 我正在尝试在 where 中执行 if,确保 REASON 不为空 @Michak Turczyn 但是 SQL 不支持这种语法。它会产生错误 请提供示例数据、期望的结果以及您要实现的逻辑的清晰说明。 请引用您的文档来源,告诉您尖括号和正斜杠是有效的语法。 【参考方案1】:

显而易见的假设是标记代码不正确。但是你可能有一个预处理器来删除它。

如果标记的代码是正确的,那么在某些情况下,逻辑是:

WHERE AND . . .

这是不正确的。一个典型的方法是:

WHERE 1 = 1 AND
    <if test="gNumber != null">
        dph.GNUMBER = #gNumber AND
    </if>
    <if test="licence != null">
        dph.dlicenceNumber = #licence AND
    </if>
       dph.REASON = (CASE WHEN dph.REASON IS NOT NULL THEN par.CODE END)

CASE 表达式本身不会导致错误。但是话又说回来,这也没有必要,因为 NULL 值无论如何都无法进行比较。所以这是等价的:

WHERE 1 = 1 AND
    <if test="gNumber != null">
        dph.GNUMBER = #gNumber AND
    </if>
    <if test="licence != null">
        dph.dlicenceNumber = #licence AND
    </if>
       dph.REASON = par.CODE

【讨论】:

以上是关于CASE SQL 语句不正确的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 中的 Case 语句将数据插入临时表

where 子句中的 case 语句 - SQL Server

SQL Case 语句中的两个值相减

在检查约束中使用 case 语句

ORDER BY 中带有 CASE WHEN 的 SQL 语句导致类型转换错误

使用带有临时变量的 MySQL CASE 语句,CASE 结果不正确?