在SQL中使用IF/CASE条件语句

3
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个关于如何在SQL中使用IF语句的问题,所以我有3个表

  • 用户
  • 机械师
  • 交流

每个表中的字段如下

 user        mechanics      exchanges
------      ----------      ---------
name         name           id_user
id_user      id_mecha       id_mecha 
                            message

我想使用以下条件,在该条件中,如果idexchanges中每个usermechanicid匹配,则选择其对应的message和名称。

SELECT CASE  
         WHEN mechanics.id_mecha = exchanges.id_mecha  
            THEN  mechanics.name, exchanges.message
         WHEN users.id_user = exchanges.id_user 
            THEN users.name, exchanges.message
FROM users 
JOIN mechanics 
JOIN exchanges
3个回答

4
双重JOIN将在机械和用户之间产生完全的叉积。这可能不是你想要的。你应该使用单个连接每个表,然后用UNION组合它们。
SELECT m.name, e.message
FROM mechanics AS m
JOIN exchanges AS e ON m.id_mecha = e.id_mecha

UNION

SELECT u.name, e.message
FROM users AS u
JOIN exchanges AS e ON m.id_user = e.id_user

你说得对,我不需要在机械和用户之间进行完整的叉积运算,所以 UNION 对我来说很好用,非常感谢。 - Jaime Quintana

0
如果我理解的正确,您需要在 SELECT 中以 END 结束 CASE,并且您需要像下面这样使用 ON 来进行 JOIN
SELECT CASE  
         WHEN mechanics.id_mecha = exchanges.id_mecha  THEN  mechanics.name
         WHEN users.id_user = exchanges.id_user THEN users.name 
       END,
       exchanges.message
FROM  users u
JOIN mechanics m ON users.id_user = exchanges.id_user
JOIN exchanges e ON mechanics.id_mecha = exchanges.id_mecha

0

实际上,您需要使用带有 case 语句的 JOIN (假设特定消息只能针对用户或特定技工 - 不会同时在一行中):

SELECT case 
       when e.id_user is null then m.name
       when e.id_mecha is null then u.name
       else null end,
       e.message
from exchanges e join users u on e.id_user=u.id_user
     join mechanics m on e.id_mecha=m.id_mecha

你的 CASE 缺少 END 关键字。 - Barmar
@Barmar,哦,是的,对此我很抱歉,谢谢你的评论,回答已经修改了。 - void

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接