在具有2个不同字段的“case”语句中使用“like”

时间:2012-01-11 23:46:12

标签: sql sql-server case

我的表格中有两个字段,我需要一个案例陈述。

Col1          Col2     Col3
abc.txt       Y        0
def.txt       N        0
bbck.txt      Y        1

Col3值基于以下Col1Col2值。
Y = 1N = 0。因此,Col2Y的{​​{1}}中的所有值都将变为1中的col3,而N中的Col2将变为0Col3中,除非col1值以%c.txt结尾。正如您所见,abc.txt%c.txt结尾,col3中的值变为0

我知道这可以通过嵌套CASE语句完成,也许可以完成。有谁知道怎么做?

这是我的代码

SELECT 
  CASE Col2
    WHEN 'Y' THEN '1'
    WHEN 'N' THEN '0'
  ELSE
(CASE WHEN [Col1] LIKE '%c.txt' THEN '0'
 END)
  END
  AS Col3,
 *
FROM Tabl1

希望这能给出一个想法

4 个答案:

答案 0 :(得分:2)

也许:

SELECT 
    CASE 
      WHEN Col2 = 'N'
        OR Col1 LIKE '%c.txt'
          THEN '0'
      WHEN Col2 = 'Y'
          THEN '1'
    END AS Col3
  , * 
FROM Tabl1

答案 1 :(得分:0)

这可能就是你要找的东西:

 SELECT * FROM Tabl1
 cross apply
    (
      select Col3 =
      CASE  
            WHEN Tabl1.Col2 = 'Y' then '1'
            WHEN Tabl1.Col2 = 'Y' then '1'
            WHEN RIGHT(Tabl1.Col1, 6) = 'c.txt' then '0'
            END 
) as Col3

答案 2 :(得分:0)

SELECT 
  CASE WHEN Col2 LIKE '%c.txt' THEN '0'
       ELSE
       CASE 
            WHEN Col2  = 'N'  THEN '0'
            WHEN Col2  = 'Y' THEN '1'
       END
  END AS COL3
FROM Tabl1

答案 3 :(得分:0)

我认为您的规格不够明确,例如是否在“UNLESS”这个词之前用逗号表示以下条款适用于两个之前的条款?

似乎有四种可能的组合:

1) Col1 LIKE '%c.txt'
   AND Col2 = 'Y'

2) Col1 LIKE '%c.txt'
   AND Col2 = 'N'

3) Col1 NOT LIKE '%c.txt'
   AND Col2 = 'Y'

4) Col1 NOT LIKE '%c.txt'
   AND Col2 = 'N'

你说

  

我需要一个案例陈述

这是真的吗?使用SQL,同样的事情总是可以通过多种方式实现(这就是为什么建立一个好的优化器很难:)我认为规范应该声明需要什么而不是对< strong>如何来实现它。

以下使用UNION而不是案例,如果您从一开始就考虑过这个问题,那么您的规范可能会更好;)

WITH Tabl1
     AS 
     (
      SELECT * 
        FROM (
              VALUES ('abc.txt', 'Y'),
                     ('def.txt', 'N'),
                     ('bbck.txt', 'Y'),
                     ('disc.txt', 'N')
             ) AS T (Col1, Col2)
     )
SELECT '0' AS Col3, *
  FROM Tabl1
 WHERE Col1 LIKE '%c.txt'
       AND Col2 = 'Y'
UNION
SELECT '0' AS Col3, *
  FROM Tabl1
 WHERE Col1 LIKE '%c.txt'
       AND Col2 = 'N'
UNION
SELECT '1' AS Col3, *
  FROM Tabl1
 WHERE Col1 NOT LIKE '%c.txt'
       AND Col2 = 'Y'
UNION
SELECT '0' AS Col3, *
  FROM Tabl1
 WHERE Col1 NOT LIKE '%c.txt'
       AND Col2 = 'N';

P.S。我把它编码为与接受的答案相符,但我不相信它是正确的!