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

时间:2016-06-16 03:24:46

标签: sql oracle select conditional sql-like

我想使用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行

2 个答案:

答案 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))
相关问题