2010-10-13 33 views
22

我有从用户的输入(通过HTML表单传递)构建的查询。它看起来像(简单的例子):像'%'不接受NULL值

Select * From [table] Where [table].[column] like '<parameter>' 

因此,如果用户离开了对应的输入字段空我通过该参数可以是可选的。它工作得很好,直到我遇到NULL值。我知道'%'符号不为空,但我想在这种情况下将NULL视为空字符串。

我该怎么办?当用户离开空输入时更改查询(如何?)或传递另一个符号?

谢谢。

PS。这是现有系统的真正问题,我知道它远非最佳解决方案,但我必须处理它。

+0

我希望你使用的是参数化查询,因为你的代码可能很适合SQL注入。参见[boby tables](http://xkcd.com/327/) – Oded 2010-10-13 13:54:19

+0

参数来自哪里? (@Oded:我想这就是''应该是什么意思......) – Tomalak 2010-10-13 13:56:27

+0

@Tomalak - 我希望你是正确的...... – Oded 2010-10-13 13:58:16

回答

50

您可以使用​​3210治疗无效像一个空字符串:

where COALESCE([table].[column],'') like '<parameter>' 

在SQL Server中,你也可以使用IsNull

where IsNull([table].[column],'') like '<parameter>' 
+0

在[table]。[column]上定义索引时怎么办? – 2014-02-14 06:59:51

3

我想这可能工作:

Select * From [table] Where [table].[column] is null or [table].[column] like '<parameter>' 
3

那么,如何

SELECT 
    * 
FROM 
    [table] 
WHERE 
    ([table].[column] like <parameter>) OR 
    (<parameter> = '%') 

...这样,当你传递'%'时,你会得到所有的行,否则它就像你现在拥有它一样。

1

做两个陈述!如果用户没有通过参数的用户:

Select * From [table] Where [table].[column] like '%' or [table].[column] is null; 
+0

令人惊讶的是,'NULL'!='NULL',你需要使用特殊的运算符'IS NULL'! – Piskvor 2010-10-13 13:58:07

+0

Ups!抱歉!我纠正了它。 – Tim 2010-10-13 14:04:51

+0

与'select * from [table]'不一样吗? – Caramiriel 2015-10-06 14:20:15

0

怎么样..

Select * From [table] Where ISNULL([table].[column], '') like '<parameter>' 

因此,这将需要您的实际列值,或者如果那空空字符串,并将它与aganist您的参数,假设您使用的ms sql服务器..

3

isnull([table]。[专栏], '')LIKE '%'

就像一个魅力

0

基于Index in Where Clause问题这种方法

where COALESCE([table].[column],'') like '<parameter>' 

是:

如果您已经使用了指数上您的[专栏],由于COALESCE功能,SQL Server无法使用您的索引,这意味着您浪费了您的索引

AND

问题这种方法

Where [table].[column] like '%' or [table].[column] is null 

是:

如果[表] [列]为null,则代码将是这样的:

Where null like '%' or [table].[column] is null 

并且无论第二Where子句的一部分([table]。[column]为null) 评估的结果将是UNKNOWN和记录的SQL Server筛选器。

NULL或真=未知

NULL或FALSE =未知

所以这是优化和空列入做法:

Select * From [table] 
WHERE 
     CASE 
      WHEN [table].[column] IS NULL THEN 1 
      WHEN [table].[column] like '<parameter>' THEN 1 
      ELSE 0 
     END = 1 
+0

这个答案只是一小块代码,它看起来与其他答案非常相似。请解释为什么这是一个很好的答案,代码的工作原理以及与其他答案的区别。 – AdrianHHH 2015-10-06 12:37:43

0

好日子,使用此解决方案,我认为这是一个解决方案的混合物:

@parameter nvarchar (30) 

if @parameter = '' 
      Begin 
          Set @parameter = '%' 
      End 

select * from [table] as t where ISNULL (t. [column], '') like '%' + @parameter + '%' 

如果你只是想开始参数,删除第一个“%”和加号

我希望你觉得它有用

0

我想类似,包括或东西,居然能找到“%”(所有)输入时的具体值。

对于Oracle isnull不起作用,而在我的案例中COALESCE都没有。

我在where子句中使用此选项:

where decode(table1.field1,null,' ',table1.field1) like '%' 

希望工程为别人着想。

+0

'coalesce'适用于Oracle。你的代码相当于'where'coalesce(table1.field,'')就像'%'' – trincot 2016-07-15 20:01:10