2011-11-18 8 views
5

フロントエンドによるユーザー入力に基づいてレコードを返すSQL Select文を作成しようとしています。 私はこのようなSELECT文を書きたい:Null値をチェックするためのパラメータ/変数を持つ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

あなたは(リンクはSQL Serverのですが、NULLIF()は標準でなければなりません)NULLIF()を使用することができます。

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

これは、変数!= 'blank'の場合、 'field = variable'を行います。 OPが変数が '空白'のときに 'field = field'を要求しました –

3

variableは 'ブランク' である場合にはfieldがNULLである場合には、次のクエリはあなたに行を与えます。

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

このソリューションはすごくうまくいった!ご協力いただきありがとうございます。 – jpuck1054700

2

として振る舞うべき以下のスニペットは、次のとおりです:variableが何か他にあるとき、それはすべての行あなたを与えるだろう

  • @variable is null、すべての行を返すとき
  • @variable = 'blank'は、すべての行場所を返すときfield is nullまたはfield = 'blank'
  • この場合、@variablefield

コードスニペット:変数とは、例えば値
を持っているときの基準がある

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パラメータの内容をテストする場合、ケースの順序が正しいことを確認する必要があります。 ''(空文字列)まず、nullをチェックし、次に等価であることを確認します。 FIELD1 = @ someParam1 –

+0

ありがとう!あなたは私の日を救った.. erm night :)これはとても良い解決策です! – cottton

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

が適用されます。

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だ場合、変数を無視することである)

条件の第2ビットの場合、あなたにある場合効果的なフィールドは= nullではないので、評価フィールドもnullです。これらは 'null'です。

混乱していますか?良い。私がやっていることに取り組む!ここで

+0

ようこそ。私はあなたのコードに付属するあなたの説明を理解していません。あなたはそれを少し修正することが可能でしょうか?あなたは自分の投稿を編集することでそれを行うことができます。 :)それはあなたの答えの方法をコミュニティにとってより価値あるものにするでしょう! – ForceMagic

0

入力varchar型の値をテストし、誰に向けた上記@Andomarの回答に基づいて私の解決策である、あなたは以下の例のように、正しい順序でパラメータをテストする必要があります。

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 

・ホープこれは誰かに役立ちます。

関連する問題