Почему null || null возвращает нулевое значение, а concat (null, null) возвращает пустую строку в postgres? - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь понять разницу между concat () и ||в postgres при использовании нулей.Почему concat () возвращает пустую строку, если обе стороны concat равны нулю?

Возьмите этот запрос Например:

SELECT concat(NULL,NULL) AS null_concat, NULL||NULL AS null_pipes, 
concat(NULL,NULL) IS NULL is_concat_null, NULL||NULL IS NULL is_pipe_null

вернет:

enter image description here

Я понимаю, что concat () игнорирует нули, но если все значения в concat равны нулю, разве ожидаемый результат не будет нулевым?Это типичное поведение всех функций в postgres?Я не смог найти ничего в документации по этому сценарию.

Редактировать:

У меня была мысль, что, возможно, это был ожидаемый результат любой строковой функции, но это не похоже надело.И upper (), и left () возвращают нули, если передано нулевое значение:

SELECT concat(NULL), NULL||NULL, UPPER(null), left(NULL,1)

Результат:

enter image description here

1 Ответ

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

в функции concat ():

text concat(str "any",...)  Concatenate all arguments. NULL arguments are ignored.

Примечание: аргументы NULL игнорируются.

Представьте себе:

Входные аргументы concat() являются динамическими.

Поэтому, когда мы пишем: concat('a',null,null,null,null) => мы написали: concat('a')

(в отличие от оператора ||, которыйNULL уничтожил все)


в ||оператор:

оператор конкатенации строк (||) по-прежнему принимает не строковый ввод, если только при хотя бы один ввод имеет строковый тип

Итак, NULL||NULL имеет неправильный синтаксис

Но почему бы не выдать Error?Потому что в операции concat, если мы не отклоним NULL (как и функция concat), они сокрушат все

SELECT NULL ||'aaa'||'bbb'||'ccc'||'ddd'

output:

NULL

больше информации :

Примечание. До выхода PostgreSQL 8.3 эти функции также принимали значения в виде нескольких нестроковых типов данных, поскольку они присутствуютнеявных приведениях из этих типов данных в текст.Эти принуждения были удалены, потому что они часто вызывали удивительное поведение.Однако оператор конкатенации строк (||) по-прежнему принимает не строковый ввод, если хотя бы один ввод имеет строковый тип, как показано в таблице 9-6.В других случаях вставьте явное приведение к тексту, если вам нужно продублировать предыдущее поведение.

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