Создать флаг в левом соединении - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь создать новый столбец (своего рода флаг идентификатора) для строк «Null» в результате моего следующего левого соединения:

with CTE (...) as (
... unrelated code
) select * from CTE

left join (select columnID from table1) Pu
on CTE.columnID = Pu.columnID

left join (select case when bz.column2 is null then 'null test is working' else columnID2, column2 end FROM table2) Bz
ON CTE.columnID2 = Bz.columnID2

Этот код работает правильно, когда я непопробуйте использовать «случай, когда».На самом деле, вы могли бы очень хорошо проигнорировать первое левое соединение.

Моя цель состояла бы в том, чтобы иметь возможность проверить результат левого соединения при этом и действовать в зависимости от результата:

Если результат левого соединения дает пустую строку: создание столбца флага для строки,

Если результат левого соединения дает нормальную строку: левое соединениевыполняется нормально , а столбец флага пуст (как я подозреваю, он не может существовать).

Я был бы рад, если бы вы могли помочь мне!

РЕДАКТИРОВАТЬ: пример таблицы:

CTE
| columnID | columnID2 | InformationsCTE | 
|    ab    |    mp     |    randominfo1  |
|    ac    |    ma     |    randominfo2  |
|    ae    |    me     |    randominfo3  |
|    ad    |    mb     |    randominfo4  |

table2
| columnID2 | InformationsTable2  | 
|    mp     |     randominfo5     |
|    ma     |     randominfo6     |
|    me     |     randominfo7     |

Результат после второго левого соединения:

new CTE
| columnID | columnID2 | InformationsCTE |  InformationsTable2|  FLAG |
|    ab    |    mp     |    randominfo1  |     randominfo5    |   OK  |
|    ac    |    ma     |    randominfo2  |     randominfo6    |   OK  |
|    ae    |    me     |    randominfo3  |     randominfo7    |   OK  |
|    ad    |    mb     |    randominfo4  |        NULL        |   NOK |

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Почему присоединяется?Кажется, вам нужно только искать данные в другой таблице, для которой вы бы использовали EXISTS или IN:

with cte (...) as (
... unrelated code
)
select 
  cte.*,
  case when columnid in (select columnid from table1) then 'okay' else 'fail' end as test1,
  case when columnid2 in (select columnid2 from table2) then 'okay' else 'fail' end as test2
from cte;
0 голосов
/ 22 октября 2018

Не будет ли более практичным SELECT этот столбец, использовать оператор ISNULL и просто использовать простой LEFT JOIN?Я чувствую, что вы немного усложняете это.

Что-то вроде:

with CTE (...) as (
... unrelated code
) 

SELECT CTE.*, NVL(bz.InformationsTable2, 'TEST OK')
FROM CTE
LEFT JOIN table2 Bz ON CTE.columnID2 = Bz.columnID2

РЕДАКТИРОВАТЬ : на основе вашего примера таблицы, если вы присоединитесь кID, затем используйте NVL в другом столбце, он должен работать для вас.

Вот пример, который я подготовил для предыдущего вопроса: SQL Fiddle

Пример был собран в mysql, так что будьте осторожны с синтаксисом, но логически он работает так же

0 голосов
/ 22 октября 2018

Просто используйте

T-SQL:

SELECT ISNULL(Column_to_check,'flag') FROM SomeTable

PL / SQL:

SELECT NVL(Column_to_check,'flag') FROM SomeTable

Также используйте NVL2, как показано ниже, если вы хотите вернуть другое значение изПроверка столбца:

NVL2(Column_to_check, value_if_NOT_null, value_if_null )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...