ユーザーの入力から作成されたクエリがあります(htmlフォームを介して渡されます)。次のようになります(簡単な例):
Select * From [table] Where [table].[column] like '<parameter>'
このパラメーターはオプションである可能性があるため、ユーザーが対応する入力フィールドを空のままにした場合、%を渡します。 NULL値に遭遇するまでは問題なく動作しました。 '%'はnullではない記号に一致することを理解していますが、この場合はNULLを空の文字列と見なします。
私は何をすべきか?ユーザーが空の入力を残したときにクエリを変更する(方法?)または別のシンボルを渡す?
ありがとう。
PS。これは既存のシステムの実際の問題であり、最適なソリューションとはかけ離れていることはわかっていますが、対処する必要があります。
coalesce
を使用して、nullを空の文字列のように扱うことができます。
where COALESCE([table].[column],'') like '<parameter>'
SQL Serverでは、IsNull
も使用できます。
where IsNull([table].[column],'') like '<parameter>'
isnull([table].[column],'') like '%'
魅力のように働く
私はこれがうまくいくと思います:
Select * From [table] Where [table].[column] is null or [table].[column] like '<parameter>'
さて、どうですか
SELECT
*
FROM
[table]
WHERE
([table].[column] like <parameter>) OR
(<parameter> = '%')
...「%」を渡すと、すべての行が返されます。それ以外の場合は、現在のように機能します。
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
2つのステートメントを作成してください!ユーザーがパラメーターuserを渡さなかった場合:
Select * From [table] Where [table].[column] like '%' or [table].[column] is null;
どう?.
Select * From [table] Where ISNULL([table].[column], '') like '<parameter>'
したがって、これは実際の列の値を取得します。それがnullの場合は空の文字列であり、ms sqlサーバーを使用していると仮定して、パラメーターと比較します。
入力時にnullまたは特定の値を含む '%'(すべて)を実際に見つけることができるように、同様のものが必要でした。
Oracleの場合、isnull
は機能せず、私の場合はCOALESCE
も機能しません。
このオプションをwhere句で使用しました:
where decode(table1.field1,null,' ',table1.field1) like '%'
それが他の人のために働くことを願っています。
こんにちは、このソリューションを使用してください、それはソリューションの混合だと思います:
@parameter nvarchar (30)
if @parameter = ''
Begin
Set @parameter = '%'
End
select * from [table] as t where ISNULL (t. [column], '') like '%' + @parameter + '%'
パラメータから始めたい場合は、最初の「%」とプラス記号を削除します
お役に立てれば幸いです
SQLITEの場合
SELECT * FROM [table] WHERE IFNULL([table].[column],'') like '<parameter>'