【问题标题】:SQL - Conditional LIKE expression based on query parameterSQL - 基于查询参数的条件 LIKE 表达式
【发布时间】:2016-10-17 09:23:56
【问题描述】:

我想根据查询参数使用 LIKE %:myParam% 选择行,前提是它不为空或不为空。 如果查询参数为 null 或为空,我想选择所有记录并删除 Like %%。 我怎样才能做到这一点?我已经尝试过 case-when 但我不确定如何在其中使用 Like。基本上我想根据空检查的结果使用类似的东西。

我有这样的事情:

Select * from myTable tbl
WHERE tbl.myCol LIKE '%' || :myParam|| '%'

例如: Select * from myTable 返回 10 行 - 其中 4 行具有 myCol= null, 如果 :myParam 为空/空,我想选择 10 行,否则我想获得与 LIKE 表达式匹配的行。如果 null 作为 :myParam 传递,我不想得到 6 行

【问题讨论】:

  • tbl.myCol LIKE '%' || nvl(:myParam,tbl.myCol) || '%'

标签: sql oracle select conditional sql-like


【解决方案1】:

我相信表达式 LIKE '%%' 会返回所有记录(至少在 MySQL 中是这样),因此您可以使用 COALESCE()NULL 值更改为空字符串:

SELECT *
FROM myTable tbl
WHERE tbl.myCol LIKE '%' || COALESECE(:myParam, '') || '%'

这种方法的好处是它避免了混乱的CASE 表达式,或者可能比这更糟的东西。

【讨论】:

  • 使用上面的查询也可以过滤空项目并且只返回非空的列行。如果 :myParam 为空/空,我也想获取空行,否则我想根据 :myParam 进行过滤。
  • 例如:Select * from myTable 返回 10 行 - 其中 4 行具有 myCol= null - 如果 myParam 为空/空,我想选择 10 行,否则我想获得与 LIKE 匹配的行。如果我在 :myParam 中传递 null,使用您的查询将返回 6 行。
  • 我认为您的 :myParam 中还有其他内容。我的查询应该适合你 AFAIK。
  • 如果我提供 :myParam=null ,我不会得到 myCol 中具有 null 的行。我已经重新检查过它并且仍然只得到非空的 myCol 行。我正在使用 Oracle 数据库
【解决方案2】:

您的原始查询应该可以工作。只需检查您是否在 :myParam 中传递空格。

Select * from myTable tbl
WHERE tbl.myCol LIKE '%' || :myParam|| '%'

例如,如果我运行以下查询,它会返回所有表的列表。

SELECT table_name FROM user_tables
WHERE table_name like '%' || '' || '%'

以下查询返回包含单词 TEMP 的所有表的列表。

SELECT table_name FROM user_tables
WHERE table_name like '%' || trim('TEMP') || '%'

您可以尝试在 myParam 周围进行修剪。

Select * from myTable tbl
WHERE tbl.myCol LIKE '%' || trim(:myParam) || '%'

尝试此查询以包含列包含 NULL 值的行。

SELECT * from myTable tbl
WHERE (tbl.myCol LIKE '%' || :myParam|| '%' 
OR (TRIM(:myParam) IS NULL AND tbl.myCol IS NULL))

【讨论】:

  • 当 null 作为参数提供时,上述查询排除了 myCol 中具有 null 的行。如果 :myParam=null 我想选择所有行,否则如果 :myParam 不为 null 然后我想根据 LIKE epression 选择行。
  • @zeppelin 这个答案对我来说是正确的,也许你的查询/数据有问题。
  • @TimBiegeleisen 请在您的回答中阅读我的 cmets。我在那里添加了一个示例来更好地解释它。
  • @zeppelin 在我的原始答案中又添加了一个查询。
  • @zeppelin 如果他的最后一个查询突然开始工作,那么这意味着您的 :myParam 参数中有空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多