2014-03-03 193 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