【问题标题】:SQL CASE that matches value or uses LIKE '%'匹配值或使用 LIKE '%' 的 SQL CASE
【发布时间】:2022-01-15 03:37:02
【问题描述】:

如果定义的变量为空,我正在尝试进行通配符检索。但我无法弄清楚正确的语法。

SELECT ...
FROM ...
WHERE customers = CASE
    WHEN ISNULL(@customerID, '') = '' THEN LIKE '%'
    ELSE @customerID
END

【问题讨论】:

  • 它是什么数据库?
  • 很抱歉没有帮助,但我不确定。此代码通过第三方软件执行。
  • minimal reproducible example 会让事情变得更清晰。

标签: sql case where-clause sql-null


【解决方案1】:

就这么简单:

WHERE customers = NULLIF(@customerID, '') OR NULLIF(@customerID, '') IS NULL

表达式NULLIF(x, '') 会将'' 转换为null。然后我们利用空值比较的工作原理:

  • 如果@customerID 不为空,则第一个条件仅在完全匹配时为真
  • 如果@customerID 为空,则第一个条件为假(无等于空),但第二个条件对所有行都为真

DB<>Fiddle

【讨论】:

  • 对不起,我想我不清楚。为空的变量是@customerID。在这种情况下,它应该检索所有客户。 WHEN CustomerID = '' THEN fetch all customers ELSE *fetch customers with customerID END 您的解决方案尝试检索没有 customerID 的任何条目。
  • 正是这样做的(阅读两个要点)。但是此查询假定空白表示 null。如果您想将'' 视为空白,则需要进行一项调整。你用的是什么 rdbms?
  • 我不确定 rdbms,因为 SQL 是通过第三方软件运行的。我已经尝试过您的解决方案,它会在填充 customerID 和空白时检索多个客户 ID。我很欣赏小提琴的链接,但现在我更困惑为什么我会遇到不同的行为。
  • 不幸的是,我无法回答任何问题。此答案基于标准 (ANSI) SQL 的工作方式。
  • 再次嗨,这正是我所需要的,错误是由于我们的测试环境中的一些格式错误的数据造成的。非常感谢您花时间回复并向我解释这一切。你帮了大忙!
【解决方案2】:

你可以这样说

SELECT...
FROM...
WHERE customers = ISNULL(@customerID,'') OR (ISNULL(@customerID,'') = '')

这应该可行,因为如果满足第一个条件,它将选择特定的客户 ID。否则,如果客户 id 为空,它将因为以下条件选择所有数据:

(ISNULL(@customerID,'') = ''

如果为 NULL,'' = '' 将为真。

【讨论】:

  • 感谢您的回复。不幸的是,这个解决方案对我不起作用,因为我在输入 customerID 的空白值时收到错误。
猜你喜欢
  • 2011-12-27
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2017-08-15
  • 2023-03-11
相关资源
最近更新 更多