我想使用LIKE%选择行:myParam%基于查询参数ONLY,如果它不为null或为空。 如果查询参数为null或为空,我想选择所有记录&放弃Like %%。 我怎样才能做到这一点?我曾尝试过case-when但我不确定如何使用Like in it。基本上我想基于null check的结果使用like。
我有这样的事情:
Select * from myTable tbl
WHERE tbl.myCol LIKE '%' || :myParam|| '%'
例如: 从myTable中选择*返回10行 - 其中4行有myCol = null, 我想在以下情况下选择10行:myParam为null / empty,否则我想获得与LIKE表达式匹配的行。如果null传递为:myParam
,我不想获得6行答案 0 :(得分:3)
我相信表达式LIKE '%%'
将返回所有记录(至少它在MySQL中),因此您可以使用COALESCE()
将NULL
值更改为空字符串:
SELECT *
FROM myTable tbl
WHERE tbl.myCol LIKE '%' || COALESECE(:myParam, '') || '%'
这种方法的好处在于它避免了一个混乱的CASE
表达式,或者可能比这更糟糕的东西。
答案 1 :(得分: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))