2013-10-16 43 views
0

如何在SQL中编写以下语句。SQL Case语句在哪里

它给我错误在喜欢。

select * from a 
where 
a.Title = case when @Title is null or @Title = '' then a.Title else like %@Title% end 
+0

如果'@ Title'是'null'或空,则此导致'a.Title = a.Title'实际上没有意义。 –

+1

其过滤标准,如果我通过标题null,那么它应该忽略标题过滤器 – Manish

+0

@Manish - a.Title = a.Title条件返回Title不为null的所有记录。这是预期的产出吗? –

回答

0

基于您对过滤条件评论,那么这

SELECT * 
FROM a 
WHERE a.Title = COALESCE(@Title, a.Title) 
+0

我已经修改的问题,请参阅 – Manish

0

这只会处理空值,但也许有人可以修改它来处理你的空CHAR/VARCHAR值,以及...应该是你之后的:

select * from a 
where @Title is null or @Title = '' or a.Title like %@Title% 
+0

其类似运营商%Title%..请参阅修改后的问题..我赶紧发布了一个错误的问题.. :( – Manish

+0

然后你只需要'或'的条件,并使用一个单独的'like' –

0

语法错误是因为你正在使用%LIKE%这不是一个有效的构造。为了得到想要的结果,你可以运行基于该条件,而不是两个不同的查询,如下图所示:

if (@Title = null or @Title = '') 
select * from a where a.Title = a.Title 
else 
select * from a where title like @Title 
+0

其中的一个条件..还有其他的过滤条件... – Manish

+0

你能发布完整的查询吗? –

0

不能混淆你的运营商一样,(=和等)。它看起来像你试图建立一个字符串,说'像%标题%',但你不能这样做。大小写只会返回一个值来比较某个事物(a.title)。正如其他几位人士所说,你需要在两次测试之间使用OR。

0

试试这个:

select 
* 
from @a a 
where 
a.Title = case when (@Title is null or @Title = '') then a.Title else @Title end 
0

操作员只需更改到LIKE,因为在输出方面a.title = a.titlea.title like a.title没有区别

select * 
from a 
where a.Title like case when @Title is null or @Title = '' then a.Title else %@Title% end 
1

这是可以做到这样:

select * from a 
where ISNULL(@Title, '') = '' or a.Title like '%' + @Title + '%' 
0

您可以使用@Giorgi Nakeuri的答案,但对于clari fying:
在查询中存在一些误区:

  1. 您正在使用%@Title%LIKE这就是你需要使用字符文字LIKELIKE '%' + @Title + '%'后无效的表达式。
  2. 您应该首先在您的账单中使用相同类型的结果在您的账单中的所有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, '') + '%'