2014-03-03 44 views
0

我也有类似的表:case语句

Create Table #test (Letter varchar(5), Products varchar(30)) 

Insert into #test (Letter, Products) 
Values ('A','B,C,D,E,F'),('B','B,C,D,E,F'),('G','B,C,D,E,F'),('Z','B,C,D,E,F'),('E','B,C,D,E,F') 

是否有可能写一个case语句,将检查是否在“产品”列清单包含从“信”列的信?

感谢

+1

逗号值是一个坏主意,你不能使用映射表?这就是说'where where charindex(','+ Letter +',',','+ Products +',')> 0' –

回答

1

下面是该查询

Select *, Case When (charindex(Letter, Products, 0)>0) Then 'Yes' Else 'No' End AS [Y/N] from #test 
+0

这里的问题一直存在,直到OP使用多个字母(它已经是'varchar(5 )')。 –

0

我想我能够做到的伎俩:

CASE WHEN Products LIKE '%'+Letter+'%' THEN 'TRUE' ELSE 'FALSE' END 
+0

这可能适用于单个字符,但不适用于字符串。 –

+0

但Letter列将始终只有一个文字记录器 – Almazini

+0

您必须知道它,因为这是您的要求。但是,您已经使用'varchar(5)'而不是'CHAR(1)'。所以它似乎并未陷入困境。我只想指出,即使它似乎有效,一旦你有多个字母,它就会停止工作。最糟糕的是,你甚至不会意识到这一点。 –

0

你可以使用EXISTS有分裂功能:

SELECT Letter, Products, 
     ContainsLetter = CASE WHEN EXISTS 
     (
      SELECT 1 FROM dbo.Split(t1.Products, ',')s 
      WHERE s.Item = Letter 
     ) 
     THEN 'Yes' ELSE 'No' END 
FROM #test t1 

Demo

这里是一个我使用的SQL Server 2005中:

CREATE FUNCTION [dbo].[Split] 
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @ItemTable TABLE (Item VARCHAR(250)) 
AS  

BEGIN  
    DECLARE @tempItemList NVARCHAR(MAX) 
    SET @tempItemList = @ItemList 

    DECLARE @i INT  
    DECLARE @Item NVARCHAR(4000) 

    SET @i = CHARINDEX(@delimiter, @tempItemList) 

    WHILE (LEN(@tempItemList) > 0) 
    BEGIN 
     IF @i = 0 
      SET @Item = @tempItemList 
     ELSE 
      SET @Item = LEFT(@tempItemList, @i - 1) 
     INSERT INTO @ItemTable(Item) VALUES(@Item) 
     IF @i = 0 
      SET @tempItemList = '' 
     ELSE 
      SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i) 
     SET @i = CHARINDEX(@delimiter, @tempItemList) 
    END 
    RETURN 
END