2016-11-15 2 views
0

Мне нужен SQL-запрос для несколько сложного SELECT. Предполагая, что в следующих таблицах:SQL-запрос для выбора из 3-х опций и из другой таблицы, основанный на значении столбца

 
Table 1:        Table 2: 
name | email  | callingcardid  id | name | email 
-------|------------|--------------  ---|--------|---------------- 
first | [email protected] | null    1 | second | [email protected] 
second |   | 1 
third |   | null 

Вывод должен быть:

 
name | email 
-------|----------- 
first | [email protected] 
second | [email protected] 
third | - 

запрос должен быть чем-то вроде

SELECT table1.name, COALESCE(NULLIF(table1.email, ''), 
CASE WHEN table1.callingcardid != NULL 
THEN (SELECT table2.email WHERE id = table1.callingcardid) ELSE '-' END) "email" 

Синтаксис, очевидно, неправильно, так как я не могу получить его Работа. Есть еще несколько столбцов с объединениями из других таблиц, но в остальном это работает. Предложение CASE является создателем проблемы.

База данных - это Microsoft SQL Server 2008 (или 2012).

+0

Где ваш JOIN?. Можете ли вы предоставить полный SQL-запрос? –

+0

No FROM clause? – jarlh

ответ

1

Попробуйте использовать COALESCE, что-то вроде этого;

SELECT 
    t1.name 
    ,COALESCE(t1.email, t2.email,'-') email 
FROM Table1 t1 
LEFT JOIN Table2 t2 
    ON t1.callingcardid = t2.id 
+0

Спасибо, я уже усложнял это. Это просто и работает. Забавно, только когда я его заработал, оказывается, мне даже не нужен запрос, так как программное обеспечение клиента автоматически обновляет электронную почту до таблицы1, если оно существует в таблице2: P – Sami

0

Этот запрос принимает во внимание возможность того, что электронная почта может быть либо NULL или пустая строка в первой таблице. В обоих случаях будет использоваться письмо со второй таблицы. Если информация электронной почты не будет доступна, для электронной почты будет отображаться одна тире.

SELECT t1.name, 
     CASE WHEN COALESCE(t1.email, '') = '' 
      THEN COALESCE(t2.email, '-') 
      ELSE t1.email END AS email 
FROM table1 t1 
LEFT JOIN table2 t2 
    ON t1.callingcardid = t2.id 
0
SELECT Table1.name 
     , CASE WHEN ISNULL(Table1.email,'') = '' 
       THEN Table2.email 
       ELSE Table1.email 
     END Email 
FROM Table1 
LEFT OUTER JOIN Table2 ON Table1.name = Table2.name 
Смежные вопросы