2010-10-13 56 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