2011-11-18 22 views
5

我想寫一個SQL Select語句來根據通過前端的用戶輸入返回記錄。 我想寫這樣的SELECT語句:在SQL中使用Case語句和參數/變量來檢查空值

SELECT somefields 
FROM sometable 
WHERE CASE variable 
     WHEN 'blank' THEN field IS NULL 
     ELSE field = field 
     END 

基本上我不是要過濾的列找到NULL值或忽略的過濾器,並返回取決於變量的值的所有值。我知道CASE聲明的結果不可執行,但我該怎麼做?

+0

什麼版本的SQL(mySQL,SQL-Server,Oracle?) – Sparky

回答

0

我想我會得到你想要的。這樣的事情可能嗎?

SELECT field1, 
    field2, 
    CASE variable 
     WHEN 'blank' THEN NULL 
     ELSE field3 
    END as field3 
FROM sometable 
2

您可以使用NULLIF()(鏈接是SQL Server,但NULLIF()應該是標準):

SELECT somefields 
    FROM sometable 
WHERE field = NULLIF(variable, 'blank') 
+0

這將使'field = variable'變量!='空白'。當變量爲'空白'時,OP請求'field = field' –

3

variable是 '空白',下面的查詢會給你行,其中field爲NULL 。當variable爲別的,它會給你的所有行:

SELECT somefields 
FROM sometable 
WHERE 
    (variable = 'blank' AND field IS NULL) 
    OR (variable <> 'blank') 
+0

這個解決方案效果很好!謝謝你的幫助。 – jpuck1054700

2

下面的片段應該表現如下:

  • @variable is null,返回所有行
  • @variable = 'blank',返回所有行field is nullfield = 'blank'
  • 否則,返回行@variable等於field

代碼片段:

WHERE 1 = CASE 
     WHEN @variable is null then 1 
     WHEN @variable = 'blank' and field is null then 1 
     WHEN @variable = field then 1 
     END 
+0

這個工作十分感謝本質上是一個查詢創建一個「可選參數」,真棒 –

+0

的注意事項:如果你正在測試,你需要確保你的情況下,爲了一個varchar參數的內容是正確的,即:檢查「」(空字符串)首先,然後檢查爲空然後是否相等,例如FIELD1 = @ someParam1 –

+0

謝謝!你拯救了我的一天..呃晚上:)這是一個非常好的解決方案! – cottton

1
SELECT somefields 
FROM sometable 
WHERE ((variable IS NULL OR variable = 0) OR (variable = field)) 

WHERE條件是申請時的變量具有價值
例如:

DECLARE @CityName VARCHAR(50) 
SET @CityName = NULL 

SELECT CityName 
FROM City 
WHERE ((@CityName IS NULL) OR (@CityName = CityName)) 

當市爲null,則表返回所有行

0

想我明白你的意思....例如.. ..

SELECT 
      House, Postcode 
    from 
      SomeTable 
    where 
      (House=isnull(@House,House) or (House is null and @House is null)) 
    and 
      (Postcode=isnull(@Postcode,Postcode) or (Postcode is null and @Postcode is null)) 

有條件的地方是使用變量,如果存在(使用isnull位是忽略變量,如果它爲空),有條件的地方是在案件的

第二位的第一個位的評價性字段爲空也是有效的字段不= null =它們是'空'。

困惑?好。儘管我在做什麼!

+0

歡迎來到SO。我不理解你的代碼附帶的解釋。有沒有可能,你返工了一點?你可以通過編輯你自己的帖子來做到這一點。 :)這將使您的社會答案的方式更有價值! – ForceMagic

0

這裏是基於@Andomar回答我的解決方案上面針對任何測試的輸入VARCHAR值,你需要測試的參數,以正確的順序按下面的例子:

FIELD1 = CASE 
    WHEN @inputParameter = '' THEN FIELD1 
    WHEN @inputParameter <> FIELD1 THEN NULL -- if input is some text but does not match 
    WHEN @inputParameter IS NULL THEN FIELD1 
    WHEN @inputParameter != '' AND FIELD1 = @inputParameter THEN FIELD1 
END 

希望這可以幫助別人。