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

基于查询参数的SQL类条件表达式,sql,oracle,select,conditional,sql-like,Sql,Oracle,Select,Conditional,Sql Like,仅当查询参数不为null或空时,我才希望基于查询参数使用LIKE%:myParam%来选择行。 如果查询参数为null或空,我希望选择所有记录并删除Like%%。 我该怎么做?我试过使用case,但我不确定如何在其中使用Like。基本上,我想基于空检查的结果使用类似的方法 我有这样的想法: Select * from myTable tbl WHERE tbl.myCol LIKE '%' || :myParam|| '%' 例如: Select*from myTable返回10行,其中4行的

仅当查询参数不为null或空时,我才希望基于查询参数使用LIKE%:myParam%来选择行。 如果查询参数为null或空,我希望选择所有记录并删除Like%%。 我该怎么做?我试过使用case,但我不确定如何在其中使用Like。基本上,我想基于空检查的结果使用类似的方法

我有这样的想法:

Select * from myTable tbl
WHERE tbl.myCol LIKE '%' || :myParam|| '%'
例如: Select*from myTable返回10行,其中4行的mycl=null,
如果:myParam为null/empty,我想选择10行,否则我想得到与LIKE表达式匹配的行。如果null被传递为:myParam

我不想得到6行。我相信表达式
如“%”
将返回所有记录(至少在MySQL中是这样),因此您可以使用
COALESCE()
null
值更改为空字符串:

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

这种方法的好处在于它避免了一个凌乱的
大小写
表达式,或者比它更糟糕的东西。

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

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

这种方法的好处在于它避免了一个凌乱的
大小写
表达式,或者比这更糟糕的东西。

您的原始查询应该可以工作。只需检查是否在: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) || '%'
尝试此查询以包括列包含空值的行

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

您的原始查询应该可以工作。只需检查是否在: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) || '%'
尝试此查询以包括列包含空值的行

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


tbl.myCol-LIKE“%”| | nvl(:myParam,tbl.myCol)| |“%”
tbl.myCol-LIKE“%”| | nvl(:myParam,tbl.myCol)| |”
使用上述查询也会过滤空项并仅返回非空列行。如果myParam为null/empty,我还希望获得空行,否则我希望根据myParam进行筛选。例如:Select*from myTable返回10行-其中4行的mycl=null-如果myParam为null/empty,我希望选择10行,否则我希望获得与之匹配的行。如果我传入null:myParam,使用您的查询将返回6行。我认为您的
:myParam
中还有其他内容。我的查询应该对您有用。如果我提供:myParam=null,我不会得到mycl中包含null的行。我重新检查了它&仍然只得到非空的mycl行。我正在使用Oracle数据库使用上述查询也会过滤空项,并仅返回非空列行。如果myParam为null/empty,我还希望获得空行,否则我希望根据myParam进行筛选。例如:Select*from myTable返回10行-其中4行的mycl=null-如果myParam为null/empty,我希望选择10行,否则我希望获得与之匹配的行。如果我传入null:myParam,使用您的查询将返回6行。我认为您的
:myParam
中还有其他内容。我的查询应该对您有用。如果我提供:myParam=null,我不会得到mycl中包含null的行。我重新检查了它&仍然只得到非空的mycl行。我使用的是Oracle数据库当null作为参数提供时,上述查询排除了mycl中有null的行。如果:myParam=null,我想选择所有行;如果:myParam不为null,我想选择基于LIKE-epression的行。@zeppelin这个答案对我来说是正确的,也许您的查询/数据有问题。@TimBiegeleisen请阅读我对您答案的评论。我在这里添加了一个示例来更好地解释它。@zeppelin在我的原始答案中又添加了一个查询。@zeppelin如果他的最后一个查询突然开始工作,则表示您的
:myParam
参数中有空格。当null作为参数提供时,上述查询排除了mycl中有null的行。如果:myParam=null,我想选择所有行;如果:myParam不为null,我想选择基于LIKE-epression的行。@zeppelin这个答案对我来说是正确的,也许您的查询/数据有问题。@TimBiegeleisen请阅读我对您答案的评论。我在这里添加了一个示例来更好地解释它。@zeppelin在我的原始答案中又添加了一个查询。@zeppelin如果他的最后一个查询突然开始工作,则表示您的
:myParam
参数中有空格。