SQL - 基于查询参数的条件 LIKE 表达式

SQL - Conditional LIKE expression based on query parameter

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

我有这样的东西:

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

例如: Select * 来自 myTable returns 10 行 - 其中 4 行的 myCol= null, 如果 :myParam 是 null/empty,我想 select 10 行,否则我想获取与 LIKE 表达式匹配的行。如果 null 作为 :myParam

传递,我不想得到 6 行

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

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

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

您的原始查询应该有效。只需检查您是否在 :myParam.

中传递 space(s)
Select * from myTable tbl
WHERE tbl.myCol LIKE '%' || :myParam|| '%'

例如,如果我 运行 下面的查询 returns 我是所有表的列表。

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

以及以下查询 returns 包含单词 TEMP 的所有表的列表。

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

您可以尝试将 trim 放在您的 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))