SQL объединяет 2 значения, одно из которых может быть нулевым - PullRequest
0 голосов
/ 05 июня 2019

У меня есть 2 таблицы

+------------+-----------+-----------+
| itemid     | version   | anything  |
+------------+-----------+-----------+
| foo        | v0        |  blah     |
| foo        | v1        |  blah     |
| foo        | NULL      |  blah     |
| foo        | v2        |  meh      |
| bar        | v0        |  meh      |
| bar        | v1        |  24       |
| baz        | NULL      |  25       |
| qux        | NULL      |  26       |
+------------+-----------+-----------+

и

+------------+-----------+-----------+
| itemid     | version   | something |
+------------+-----------+-----------+
| foo        | v0        |  weck     |
| foo        | NULL      |  wock     |
| foo        | v2        |  weck     |
| bar        | v0        |  meck     |
| bar        | v1        |  cuack    |
| baz        | NULL      |  crack    |
| qux        | NULL      |  blah     |
+------------+-----------+-----------+

Мне нужно объединить обе таблицы по itemid и version, поэтому результат будет выглядеть так:

+------------+-----------+-----------+-----------+
| itemid     | version   | anything  | something |
+------------+-----------+-----------+-----------+
| foo        | v0        |  blah     |  weck     |
| foo        | v1        |  blah     |  NULL     |
| foo        | NULL      |  blah     |  wock     |
| foo        | v2        |  meh      |  weck     |
| bar        | v0        |  meh      |  meck     |
| bar        | v1        |  24       |  cuack    |
| baz        | NULL      |  25       |  crack    |
| qux        | NULL      |  26       |  blah     |
+------------+-----------+-----------+-----------+

Я делаю

SELECT t1.itemid,
       t1.version,
       t1.anything,
       t2.something
FROM table1 AS t1
LEFT JOIN table2 AS t2
ON t1.itemid=t2itemid AND t1.version=t2.version

Он работает со строками, которые имеют значение версии, но если значение версии NULL, тогда строки с нулевыми значениями выглядят так:

+------------+-----------+-----------+-----------+
| itemid     | version   | anything  | something |
+------------+-----------+-----------+-----------+
| foo        | NULL      |  blah     |  NULL     |
| baz        | NULL      |  25       |  NULL     |
| qux        | NULL      |  26       |  NULL     |
+------------+-----------+-----------+-----------+

Я пытался изменить условие соединения с помощью:

ON t1.itemid=t2.itemid AND (t1.version=t2.version OR ((t1.version is null) AND (t2.version is null)))

с точно таким же результатом

Я пытался также изменить условие с помощью:

ON t1.itemid=t2.itemid AND (t1.version=t2.version OR ((isnull(t1.version,'-')) AND (isnull(t1.version,'-'))))

тогда я получаю ошибку: An expression of non-boolean type specified in a context where a condition is expected,near 'AND' [SQL State=S0001, DB Errorcode=4145]

Как я могу объединить строки с одинаковыми itemid и NULL version ??

РЕДАКТИРОВАТЬ: возможно, это не важно, но в моем реальном запросе table1 и table2 - результаты выбора, и есть третий выбор, который я пропустил для примера, который также содержит itemid и версию.Так что это соединение избранных.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

В последнем примере вы используете ISNULL неправильно - попробуйте -

   SELECT t1.itemid,
           t1.version,
           t1.anything,
           t2.something
    FROM table1 AS t1
    LEFT JOIN table2 AS t2
    ON t1.itemid=t2itemid AND ISNULL(t1.version, '-') = ISNULL(t2.version, '-')
0 голосов
/ 06 июня 2019

Наконец я нашел проблему. Кажется, что поля NULL не всегда NULL, иногда поля NULL содержат нечто, отличное от NULL, '' или ' '

Я не знаю, что именно содержат эти поля, это невидимый символ. Но, к счастью, поле версии всегда начинается с V, поэтому я поместил это состояние в поле версии:

IIF (t1.version like 'V%', t1.version, NULL)

Таким образом, я заверяю, что это поле содержит значение NULL, и тогда все, кажется, работает нормально.

Эти значения всегда равны NULL, если не 'V%', так что, возможно, это вызвано тем, кто вводит строки в БД ...

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