我的查询是根据用户的输入构建的(通过html表单传递)。它看起来像(简单的例子):
Select * From [table] Where [table].[column] like '<parameter>'
此参数可以是可选的,因此如果用户将相应的输入字段留空,则传递%。它工作正常,直到我遇到NULL值。我理解'%'匹配的符号不是null,但我想在这种情况下将NULL视为空字符串。
我该怎么办?当用户离开空输入时,更改查询(如何?)或传递另一个符号?
感谢。
PS。这是现有系统的真正问题,我知道它远非最佳解决方案,但我必须处理它。
答案 0 :(得分:52)
您可以使用coalesce
将null视为空字符串:
where COALESCE([table].[column],'') like '<parameter>'
在SQL Server上,您还可以使用IsNull
:
where IsNull([table].[column],'') like '<parameter>'
答案 1 :(得分:3)
我认为这可行:
Select * From [table] Where [table].[column] is null or [table].[column] like '<parameter>'
答案 2 :(得分:3)
嗯,怎么样
SELECT
*
FROM
[table]
WHERE
([table].[column] like <parameter>) OR
(<parameter> = '%')
...所以当你传递'%'时,你会得到所有的行,否则就像你现在拥有它一样。
答案 3 :(得分:3)
isnull([table]。[column],'')喜欢'%'
像魅力一样工作
答案 4 :(得分:1)
发表两个声明!如果用户没有传递参数user:
Select * From [table] Where [table].[column] like '%' or [table].[column] is null;
答案 5 :(得分:1)
基于此问题的Index in Where Clause问题
where COALESCE([table].[column],'') like '<parameter>'
是:
如果您在[column]上使用了索引,由于COALESCE函数,SQL Server无法使用您的索引,这意味着您已经浪费了索引
AND
采用这种方法的问题
Where [table].[column] like '%' or [table].[column] is null
是:
如果[table]。[column]为null,则代码如下:
Where null like '%' or [table].[column] is null
并且无论Where子句的第二部分([table]。[column]为null) 评估结果将是UNKNOWN和记录输出的SQL Server过滤器。
NULL或True = UNKNOWN
NULL或False = UNKNOWN
所以这是优化的和包含空的方法:
Select * From [table]
WHERE
CASE
WHEN [table].[column] IS NULL THEN 1
WHEN [table].[column] like '<parameter>' THEN 1
ELSE 0
END = 1
答案 6 :(得分:0)
怎么样..
Select * From [table] Where ISNULL([table].[column], '') like '<parameter>'
所以这将取你的实际列值,或者如果那是空的一个空字符串并比较它对你的参数,假设你使用ms sql server ..
答案 7 :(得分:0)
美好的一天,使用这个解决方案,我认为它是解决方案的混合物:
factor
如果您只想从参数开始,请删除第一个'%'和加号
我希望你觉得它很有用
答案 8 :(得分:0)
我想要类似的东西,实际上能够找到'%'(全部),包括 null 或输入时的特定值。
对于Oracle isnull
不起作用,在我的情况下COALESCE
也不起作用。
我在where子句中使用了这个选项:
where decode(table1.field1,null,' ',table1.field1) like '%'
希望它适用于其他人。
答案 9 :(得分:0)
对于SQLITE
SELECT * FROM [table] WHERE IFNULL([table].[column],'') like '<parameter>'