web-dev-qa-db-ja.com

'%'のようにNULL値を受け入れない

ユーザーの入力から作成されたクエリがあります(htmlフォームを介して渡されます)。次のようになります(簡単な例):

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

このパラメーターはオプションである可能性があるため、ユーザーが対応する入力フィールドを空のままにした場合、を渡します。 NULL値に遭遇するまでは問題なく動作しました。 '%'はnullではない記号に一致することを理解していますが、この場合はNULLを空の文字列と見なします。

私は何をすべきか?ユーザーが空の入力を残したときにクエリを変更する(方法?)または別のシンボルを渡す?

ありがとう。

PS。これは既存のシステムの実際の問題であり、最適なソリューションとはかけ離れていることはわかっていますが、対処する必要があります。

26
zgorawski

coalesceを使用して、nullを空の文字列のように扱うことができます。

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

SQL Serverでは、IsNullも使用できます。

where IsNull([table].[column],'') like '<parameter>'
53
Andomar
isnull([table].[column],'') like '%'

魅力のように働く

4
Pedro Rodrigues

私はこれがうまくいくと思います:

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

さて、どうですか

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

...「%」を渡すと、すべての行が返されます。それ以外の場合は、現在のように機能します。

3
Matt Gibson

Where句のインデックス このアプローチの問題に基づく

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

は:

COALESCE関数のために[列]でインデックスを使用した場合、SQL Serverはインデックスを使用できません。つまり、インデックスが無駄になっています。

そして

このアプローチの問題

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

は:

[table]。[column]がnullの場合、コードは次のようになります。

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

また、Where句の2番目の部分([table]。[column]がnull)に関係なく、評価の結果はUNKNOWNになり、SQL Serverフィルターによって記録されます。

NULL OR True = UNKNOWN

NULL OR False = UNKNOWN

したがって、これは最適化されたnullを含むアプローチです。

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

2つのステートメントを作成してください!ユーザーがパラメーターuserを渡さなかった場合:

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

どう?.

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

したがって、これは実際の列の値を取得します。それがnullの場合は空の文字列であり、ms sqlサーバーを使用していると仮定して、パラメーターと比較します。

1
Shawson

入力時にnullまたは特定の値を含む '%'(すべて)を実際に見つけることができるように、同様のものが必要でした。

Oracleの場合、isnullは機能せず、私の場合はCOALESCEも機能しません。

このオプションをwhere句で使用しました:

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

それが他の人のために働くことを願っています。

0
nathie

こんにちは、このソリューションを使用してください、それはソリューションの混合だと思います:

@parameter nvarchar (30)

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

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

パラメータから始めたい場合は、最初の「%」とプラス記号を削除します

お役に立てれば幸いです

0
Neftali Rios

SQLITEの場合

SELECT * FROM [table] WHERE IFNULL([table].[column],'') like '<parameter>'
0
ndw