2017-06-15 168 views
1

我真的很努力地找到这个问题的答案。我想写一个if或case语句来改变另一列的值。如果“检查”列是0,那么列'点'也应该为0。SQL中的IF/CASE语句

SELECT club_name, COALESCE(club_winner,0) AS 'check', COUNT(*) AS points, 
    CASE 
    WHEN check = '0' 
    THEN points = '0' 
    ELSE check 
    END as Saleable 
    FROM clubs c 
    LEFT JOIN club_results cr ON c.club_id = cr.club_winner 
    GROUP BY club_name ORDER BY points DESC 
+1

你的意思是“当检查=‘0’,则‘0’ELSE END点为点”? –

+0

是否要在表格中更新它,或者直接显示它? –

+0

这是MySQL还是Transact-SQL? – Black

回答

3

您不能在case语句中“SET”列,您可以返回值。将case语句看作可变列。返回'0'AS Saleable(或任何您想要命名的列)。

SELECT club_name, COALESCE(club_winner,0) AS 'check', COUNT(*) AS points, 
CASE 
WHEN COALESCE(club_winner,0) = 0 
THEN 0 
ELSE COUNT(*) 
END AS points_or_0_if_check_is_0 
FROM clubs c 
LEFT JOIN club_results cr ON c.club_id = cr.club_winner 
GROUP BY club_name ORDER BY points_or_0_if_check_is_0 DESC 
+1

您以后在select子句中不能重复使用较早的列别名。 – Donnie

+0

哎呀,@Donnie。思想检查是一个常规专栏(错过了上面的) – FrankerZ

+0

也是'points'别名。 – Donnie

0

可以选择只计算符合左连接,像这样的行:

SELECT 
    club_name, 
    COUNT(
     CASE WHEN 
      club_winner IS NOT NULL 
     THEN 
      CR.id 
     ELSE 
      NULL 
     END 
    ) AS `points` 
FROM 
    clubs C 
LEFT JOIN 
    club_results CR ON C.club_id = CR.club_winner 
GROUP BY 
    C.club_id 
ORDER BY 
    points DESC