2015-02-19 3 views
3

У меня есть вопрос о том, как использовать оператор IF в SQL, поэтому у меня есть 3 таблицыИспользование IF/СЛУЧАЙ кондиционирования в SQL

  • пользователя
  • механики
  • обмены

Поля в каждой из таблиц следующие:

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

Я хочу использовать условие как следующий, в котором я собираюсь выбрать имя user или mechanic с их соответствующими message, если их id совпадает с тем, что exchanges имеет для каждого из них (user или mechanic)

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 

ответ

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 
+0

Вы были правы, я не хотел полного перекрестного продукта между механиками и пользователями, поэтому СОЮЗ работал отлично для меня, спасибо большое. –

+0

Нажмите галочку, чтобы принять ответ. – Barmar

0

Если я правильно понимаю, что вам нужно END в CASE в SELECT, и вы должны иметь 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

на самом деле вам нужно JOIN с case заявление (предполагается, что в конкретное сообщение может быть только для пользователя или для конкретного Механик не для обоих одновременно в одной строке):

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 
+0

Вам не хватает ключевого слова 'END' для' CASE'. – Barmar

+0

@Barmar, о да, извините за это и спасибо за ваш комментарий. ответ отредактирован. – jfun

Смежные вопросы