【问题标题】:Check list of values is NULL in PL/SQLPL/SQL 中的值检查列表为 NULL
【发布时间】:2013-08-10 00:54:49
【问题描述】:

有没有办法检查 PL/SQL 中的值列表是否为 NULL

我有一些类似的东西:

SELECT * FROM myTable t WHERE t.dataId IN (:myList) OR :myList IS NULL

在运行时,:myList 符号被替换为字符串列表,例如

SELECT * FROM myTable t WHERE t.dataId IN ('a', 'b', 'c') OR  ('a', 'b', 'c') IS NULL

我已经意识到 ('a', 'b', 'c') IS NULL 是无效的 PL/SQL,所以我想知道是否有另一种方法来检查评估为 NULL 的值列表。

我试图模拟的行为会将('a', 'b', 'c') 评估为NOT NULL。我试图避免创建另一个变量(例如:myListFlag),如果列表为空,它将返回 ''

【问题讨论】:

    标签: java sql plsql


    【解决方案1】:

    也许COALESCE 会帮助你:

    它计算从左到右的值列表并返回第一个值NOT NULL。如果所有值都是NULL,则计算结果为NULL,这是您可以检查IS NULL 的单个值。

     SELECT * FROM myTable t WHERE t.dataId IN (:myList) OR COALESCE(:myList) IS NULL
    

    【讨论】:

    • 谢谢!我认为这个功能可能是解决方案。我意识到如果 :myList 为空,它会返回'',所以我认为解决方案是使用COALESCE(:myList, '') IS NULL。看起来对吗?
    • @Alex:我手头没有 Oracle DB 来测试它。请报告它是否有效。
    • 我使用了 COALESCE(:myList, NULL) IS NULL 形式,但 COALESCE(:myList, '') IS NULL 也可以使用,因为 Oracle 按照 stackoverflow.com/a/15357813/908677 或 @987654322 将 '' 视为 NULL @
    • COALESCE(:myList) 仍然有效,它只需要逗号分隔的值。它可能会给您一个 lint 错误,但是当您运行代码时,它会通过,因为 :myList 实际上是一个列表或 null。
    【解决方案2】:

    我不熟悉下面的语法做你所期望的:

    WHERE t.dataId IN (:myList)
    

    通常,变量替换会产生单个值。因此,如果值为'a,b,c',那么这将匹配'a,b,c' 的值,但不匹配'a'

    您可以使用其他表达式来执行此操作。最通用的(即适用于大多数数据库)是这样的:

    where ','||:myList||',' like '%,'||t.data_id||',%'
    

    有了这样的结构,你可以很容易地说:

    where ','||:myList||',' like '%,'||t.data_id||',%' and :myList is not null
    

    肯定还有其他方法可以做到这一点。在网络上快速搜索会出现this 之类的内容。

    【讨论】:

    • 我使用的是Spring NamedParameterJdbcTemplate 类,示例在这里:stackoverflow.com/questions/14433438/…
    • @Alex 。 . .这很酷。我很高兴开始支持此功能。我的建议是将列表转换为字符串并将其作为另一个参数传递,您可以将其与NULL(或'')进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2012-05-23
    相关资源
    最近更新 更多