PostgreSQL сравнение нулевых значений в регистре - PullRequest
0 голосов
/ 14 февраля 2020

, когда я написал оператор case для сравнения значений в таблицах, он отклеился с переменными, которые являются нулевыми. Он думает, что они разные (примечание: col1 - это символьное поле).

select a.id,
       a.col1 as a_col1,
       b.col1 as b.col1,
       case when a.col1=b.col1 then 0 else 1 end as chk_col1
from   tablea a,
       tableb b
where a.id=b.id;

... chk_col1 всегда равно 0, когда оба col1 равны нулю. Я пробовал

coalesce(a.col1,'null') as coalesce(b.col1,'null')

, но это тоже не сработало. Это все еще возвратило 1 для chk_col1.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Postgres поддерживает нулевое безопасное сравнение operator is not distinct from. Итак, попробуйте это:

select a.id,
       a.col1 as a_col1,
       b.col1 as b.col1,
       (case when a.col1 is not distinct from b.col1 then 0 else 1 end) as chk_col1
from tablea a join
     tableb b
     on a.id = b.id;

Лично я бы оставил значение как логическое:

select a.id, a.col1 as a_col1, b.col1 as b.col1,
       (a.col1 is distinct from b.col1) as chk_col1
from tablea a join
     tableb b
     on a.id = b.id;

Также обратите внимание, что я использовал правильный, явный, стандарт, читаемый JOIN синтаксис.

0 голосов
/ 14 февраля 2020

РЕШЕНИЕ! : Переменная, на которую ссылается функция colaesce, должна быть вычисленной, то есть

coalesce(a_col1,'null') as coalesce(b_col1,'null')

Еще одна вещь, которую я обнаружил. Допустим, col2 это цифра c. Выше не работает, вам нужно использовать 0. Или ... более хитроумно, вы можете использовать «0», то есть

coalesce(a_col2,'0') as coalesce(b_col2,'0')

Это удобно знать, если вы хотите сгенерировать некоторый код для сравнения таблиц путем ссылки на pg_tables или svv_columns. В этом коде у меня было 2 таблицы, которые я создал, читая таблицу метаданных svv_columns, и я хотел создать оператор case для каждой переменной, поэтому у меня было бы две переменные из каждой таблицы рядом плюс переменная check, которую я Использовать для подведения итогов позже:

select '       coalesce(a.'||a.column_name||',''0'') as a_'||a.column_name||', coalesce(b.'||b.column_name||',''0'') as b_'||b.column_name||', case when a_'||a.column_name||'=b_'||b.column_name||' then 0 else 1 end as chk_'||a.column_name||','
from   tbl_a_vars a,
       tbl_b_vars b
where a.column_name=b.column_name;
...