SQL CASE:如果2个不同的列=某个东西,那么第3列=某些东西; IF [a] = a AND [b] = b THEN [c] = c

时间:2014-10-17 22:55:30

标签: sql sql-server case

以下是我的剧本:

SELECT 
    *
    ,CASE WHEN (Confirmed = 'YES' AND R.Performed IS NULL AND (R.Name NOT LIKE 'C%' OR R.Name NOT LIKE 'Q%')) 
          THEN s.Description = 'CONFIRMED' 
     END
FROM
    Repair r
INNER JOIN 
    Conversion C
ON 
    R.Confirmed = C.confirmed
AND 
    r.performed = c.performed
INNER JOIN
    Status s
ON 
    a.name = s.name
WHERE 
    Status = 'CONFIRMED'
AND 
    Received BETWEEN '01-31-2013' AND '12-31-2013'
and part = '4'

注意:我在案例陈述中的最后'=''END'下获得了红色方形。

我的语法有什么问题?

4 个答案:

答案 0 :(得分:0)

我不清楚你想要完成什么,但这样的事情是你可能需要的

,CASE WHEN (Confirmed = 'YES' AND R.Performed IS NULL 
           AND (R.Name NOT LIKE 'C%' OR R.Name NOT LIKE 'Q%')) 
 THEN 'CONFIRMED' ELSE s.Description END AS Description

如果您只是想在确认时更改说明的值='是'然后以下工作

,CASE WHEN Confirmed = 'YES' THEN 'CONFIRMED' ELSE s.Description END AS Description

您还需要不使用SELECT *,并且每个列都单独标识,因此Description在选择中不会出现两次。我不确定为什么s.Description IS NULL AND ...不属于您的CASE条件,如果您正试图填写缺失的说明。

答案 1 :(得分:0)

您的CASE声明应如下所示。您收到错误的原因是您尝试向descriptions.Description = 'CONFIRMED'添加值,这是不允许的。

CASE WHEN (Confirmed = 'YES' AND R.Performed IS NULL 
AND (R.Name NOT LIKE 'C%' OR R.Name NOT LIKE 'Q%')) 
THEN 'CONFIRMED' END AS Description 

答案 2 :(得分:0)

试着追随你真正想要的东西和它的努力,但我想你想要的东西是:

SELECT r.confirmed
       ,r.status
       ,a.name
       ,<other fields>
       ,CASE WHEN (    Confirmed = 'YES' 
                   AND R.Performed IS NULL 
                   AND (   R.Name NOT LIKE 'C%' 
                        OR R.Name NOT LIKE 'Q%')
                  ) 
             THEN 'CONFIRMED' 
             ELSE s.Description 
         END AS Description
FROM <your joined and filtered tables>

我认为,您只需要在此选择查询的输出中更改s.description,而不是在源表中更改。

答案 3 :(得分:0)

试试这个

CASE s.Description WHEN (Confirmed = 'YES' AND R.Performed IS NULL AND (R.Name NOT LIKE 'C%' OR R.Name NOT LIKE 'Q%')) 
          THEN 'CONFIRMED' 
     END

我没有使用else部分,因为你没有在你的代码中使用它,它不会导致任何语法错误