Как преобразовать этот usql в правильный запрос sql - PullRequest
0 голосов
/ 17 октября 2018
SELECT DISTINCT 
d.id AS id, 
CASE
    WHEN (c.a = 'UNK' ? NULL : c.a) IS NOT NULL THEN c.a
    WHEN (b.a = 'UNK' ? NULL : b.a) IS NOT NULL THEN b.a
    WHEN (c.e = 'UNK' ? NULL : c.e) IS NOT NULL THEN c.e
    ELSE b.e
END AS output,
FROM 
   db.table
...random irrelevant joins..

Я проследил проблему до конца части моего кода.Я получаю ошибку исключения разбора.Я предполагаю, что (c.a = 'UNK' ? NULL : c.a) не поддерживается.Как бы я преобразовал это?

Ответы [ 2 ]

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

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

SELECT DISTINCT d.id AS id, 
       (CASE WHEN c.a <> 'UNK' THEN c.a
             WHEN b.a <> 'UNK' THEN b.a
             WHEN c.e <> 'UNK' THEN c.e
             ELSE b.e
        END) AS output,
FROM . . .

NULL не сможет выполнить сравнение <>, так что это должно быть семантически эквивалентным.

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

Это:

SELECT DISTINCT 
d.id AS id, 
CASE
    WHEN c.a != 'UNK' THEN c.a
    WHEN b.a != 'UNK' THEN b.a
    WHEN c.e != 'UNK' THEN c.e
    ELSE b.e
END AS output,
FROM db.table;

В качестве альтернативы (c.a = 'UNK' ? NULL : c.a) IS NOT NULL совпадает с NULLIF(c.a, 'UNK') IS NOT NULL => c.a != 'UNK'

...