Всегда ли конкатенация NULL + «что-то» дает NULL? Зачем? - PullRequest
0 голосов
/ 22 июня 2019

Я хочу применить вычисление OUTER APPLY к каждой строке набора. Это вычисление объединяет несколько строковых полей в одно, но иногда эти поля являются нулевыми или заполнены пустыми строками. Конкатенация использует «-» в качестве разделителя между полями, поэтому, когда они пусты («»), результатом будет «----» вместо NULL, результат, который я хотел бы получить.

Перед выполнением этого вычисления мне нужно проверить значение этих полей.

Как бы вы это сделали?

Я думал об использовании NULLIF, и похоже, что он ведет себя так, как я ожидал, но я не знаю почему.

Будет ли конкатенация NULL + 'нечто' всегда иметь значение NULL? Зачем?

SELECT 
string_1,
string_2,
string_3,
string_4,
string_5,
string_concat,
FROM Table1
OUTER APPLY(VALUES(NULLIF(string_1,'')+'-'+NULLIF(string_2,'')+'-'+NULLIF(string_3,'')+'-'+NULLIF(string_4,'')+'-'+NULLIF(string_5,''))) v1(string_concat) 

Таблица1 не имеет никакого индекса, и я не могу его реализовать.

Этот код лучше с точки зрения производительности, чем выполнение CASE в SELECT?

Мне это нравится, потому что код выглядит более чистым.

Ответы [ 2 ]

3 голосов
/ 22 июня 2019

Всегда ли конкатенация NULL + NULL + 'нечто' всегда равна NULL?Почему?

Это зависит от настройки SET CONCAT_NULL_YIELDS_NULL.Если это ON (по умолчанию), тогда да, конкатенация NULL с оператором + всегда даст NULL

Я бы, наверное, сделал это так, хотя

SELECT string_1,
       string_2,
       string_3,
       string_4,
       string_5,
       string_concat,
FROM   Table1
       CROSS APPLY(VALUES (NULLIF(CONCAT(string_1, '-', string_2, '-', string_3, '-', string_4, '-', string_5), '----')) ) v1(string_concat) 

, поэтому требуется только один NULLIF - для результата CONCAT.

Поскольку предложение VALUES всегда возвращает ровно одну строку, которую вы можете использовать CROSS APPLY

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

Будет ли конкатенация NULL + 'нечто' всегда иметь значение NULL? Почему?

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

NULL на самом деле означает, что вы чего-то не знаете или что-то неприменимо и, следовательно, не применимо в этом контексте. Поэтому все, что вы делаете с тем, чего не знаете или не имеет смысла, приведет к результату «Я до сих пор не знаю / не имеет смысла».

Например: скажем, у вашего друга есть 2 машины, а у вашего друга - несколько машин, но вы не знаете, сколько их. Если бы я спросил вас, сколько автомобилей у ваших друзей, единственный ответ, который вы могли бы дать мне, - это то, что вы на самом деле не знаете.

Надеюсь, это поможет понять. Проблема с NULL гораздо больше, чем эта, так как она включает 3-значную логику вместо более распространенной и хорошо понятной 2-значной логики. Вот более подробно по этому вопросу: http://www.dbdebunk.com/2017/04/null-value-is-contradiction-in-terms.html

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