SQLで以下のステートメントを書くにはどうすればよいですか。
同様にエラーが発生します。
select * from a
where
a.Title = case when @Title is null or @Title = '' then a.Title else like %@Title% end
SQLで以下のステートメントを書くにはどうすればよいですか。
同様にエラーが発生します。
select * from a
where
a.Title = case when @Title is null or @Title = '' then a.Title else like %@Title% end
これは null 値のみを処理しますが、空の char/varchar 値も処理するように変更できる可能性があります...
SELECT *
FROM a
WHERE a.Title = COALESCE(@Title, a.Title)
フィルター基準に関するコメントに基づいて、これはあなたが求めているものになるはずです:
select * from a
where @Title is null or @Title = '' or a.Title like %@Title%
@Giorgi Nakeuriの回答を使用できますが、明確にするために:
クエリにいくつかのエラーがあります:
%@Title%
後に文字リテラルを使用LIKE
する必要がある無効な式です。LIKE
LIKE '%' + @Title + '%'
CASE
ステートメントにあるすべてのブランチで同じタイプの結果を使用する必要があります。a.title
like %@Title%
したがって、正しいクエリは次のようになります。
SELECT *
FROM a
WHERE
1 = CASE
WHEN @Title IS NULL THEN 1
WHEN @Title = '' THEN 1
WHEN a.Title LIKE '%' + @Title + '%' THEN 1
ELSE 0
END
ただし、次のように簡略化できます。
SELECT *
FROM a
WHERE a.Title LIKE '%' + ISNULL(@Title, '') + '%'
そのような演算子 (= など) を混在させることはできません。「like %Title%」という文字列を作成しようとしているようですが、それはできません。Case は単純に何か (a.title) と比較する値を返します。他の何人かが言っているように、2 つのテストの間で OR を使用する必要があります。
構文エラーは、有効な構文ではない %LIKE% を使用しているためです。目的の結果を得るには、代わりに、以下のように条件に基づいて 2 つの異なるクエリを実行できます。
if (@Title = null or @Title = '')
select * from a where a.Title = a.Title
else
select * from a where title like @Title
出力に関してとLIKE
の間に違いがないため、演算子を に変更するだけですa.title = a.title
a.title like a.title
select *
from a
where a.Title like case when @Title is null or @Title = '' then a.Title else %@Title% end
これを試して :
select
*
from @a a
where
a.Title = case when (@Title is null or @Title = '') then a.Title else @Title end