Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032

Использование null

17.11.2023, 15:10. Показов 654. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

MS SQL
Есть такие исходные данные
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
CREATE TABLE test.myDict ([name] VARCHAR(10) NULL);
INSERT INTO test.myDict ([name]) VALUES ('Иванов'), ('Петров'), (NULL);
 
CREATE TABLE test.myTable10 ([name] VARCHAR(10) NULL, [VALUE] INT NULL);
INSERT INTO test.myTable10 ([name], [VALUE]) VALUES ('Иванов', 1), ('Петров', 2), (NULL,3);
 
CREATE TABLE test.myTable20 ([name] VARCHAR(10) NULL, [VALUE] INT NULL);
INSERT INTO test.myTable20 ([name], [VALUE]) VALUES ('Иванов', 10), ('Петров', 20), (NULL,30);


Такой запрос одинаково работает как и при SET ANSI_NULLS ON;, так и при SET ANSI_NULLS OFF;
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
    t1.[name],
    t2.[VALUE],
    t3.[VALUE]
FROM
    test.myDict t1
LEFT JOIN
    test.myTable10 t2
ON
    (t1.[name] = t2.[name]) OR (t1.[name] IS NULL AND t2.[name] IS NULL)
LEFT JOIN
    test.myTable20 t3
ON
    (t1.[name] = t3.[name]) OR (t1.[name] IS NULL AND t3.[name] IS NULL)


Так работает корректно.
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SET ANSI_NULLS OFF;
SELECT
    t1.[name],
    t2.[VALUE],
    t3.[VALUE]
FROM
    test.myDict t1
LEFT JOIN
    test.myTable10 t2
ON
    (t1.[name] = t2.[name]) OR (t1.[name] = NULL AND t2.[name] = NULL)
LEFT JOIN
    test.myTable20 t3
ON
    (t1.[name] = t3.[name]) OR (t1.[name] = NULL AND t3.[name] = NULL)
При SET ANSI_NULLS ON; работает некорректно, то есть для значения null из test.myDict не вытягиваются данные из test.myTable10 и test.myTable20, а возвращает null.

Postgre SQL
Работает корректно.
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
    t1."name",
    t2."value",
    t3."value"
FROM
    test.myDict t1
LEFT JOIN
    test.myTable10 t2
ON
    (t1."name" = t2."name") OR (t1."name" IS NULL AND t2."name" IS NULL)
LEFT JOIN
    test.myTable20 t3
ON
    (t1."name" = t3."name") OR (t1."name" IS NULL AND t3."name" IS NULL)


Работает не корректно.
Кликните здесь для просмотра всего текста
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
    t1."name",
    t2."value",
    t3."value"
FROM
    test.myDict t1
LEFT JOIN
    test.myTable10 t2
ON
    (t1."name" = t2."name") OR (t1."name" = NULL AND t2."name" = NULL)
LEFT JOIN
    test.myTable20 t3
ON
    (t1."name" = t3."name") OR (t1."name" = NULL AND t3."name" = NULL)


Скажите, в PostgreSQL не получится использовать = Null, верно? Похоже там нет наподобие SET ANSI_NULLS OFF;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2023, 15:10
Ответы с готовыми решениями:

Использование LAG, исключая поля NULL
Все привет. Работаю с PostgreSQL. Есть такая задача, если запрос возвращает NULL подставлять значение из предыдущей строки. Для таких...

Как сделать, чтобы в оконном алгоритме NULL было не равно NULL?
Всем привет. Вопрос темы поясняю на примере. Пример вымышленный. Вот таблица: CREATE TABLE player ( id bigserial NOT NULL, ...

UPDATE SELECT, ERROR: null value in column violates not-null constraint
Здравствуйте. Две таблицы, из одной значением integer модифицируется int другой таблицы. В таблице-приёмнике ограничение NOT NULL. ...

6
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,024
17.11.2023, 21:21
Сравнивать с NULL нельзя. Точнее можно, но это будет ни FALSE, ни TRUE, это будет неизвестность!
Даже если MS SQL и позволяет это делать, это не значит, что это одобряет SQL стандарт.

Вот здесь расписано как можно поступить:
https://www.postgresql.org/doc... rison.html

Также посмотрите на IS DISTINCT FROM
https://wiki.postgresql.org/wiki/Is_distinct_from
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 811
18.11.2023, 09:47
обратите внимание на оператор is distinct from

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
    t1."name",
    t2."value",
    t3."value"
FROM
    test.myDict t1
LEFT JOIN
    test.myTable10 t2
ON
   NOT NULLIF(t1."name",'') IS DISTINCT FROM NULLIF(t2."name",'')
LEFT JOIN
    test.myTable20 t3
ON
   NOT NULLIF(t1."name",'') IS DISTINCT FROM NULLIF(t3."name",'')
Так же не забываем что пустая строка и null строка это разные вещи
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
20.11.2023, 10:03  [ТС]
Спасибо!
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
22.11.2023, 14:09  [ТС]
Еще такой момент. В ON учитывается регистр.

Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE TABLE test.myDict ("name" VARCHAR(10) NULL);
INSERT INTO test.myDict ("name") VALUES ('Иванов'), ('Петров'), ('Сидоров'), ('Васильев'), (NULL);
 
CREATE TABLE test.myTable10 ("name" VARCHAR(10) NULL, "VALUE" INT NULL);
INSERT INTO test.myTable10 ("name", "VALUE") VALUES ('Иванов', 1), ('Петров', 2), ('сидоров', 3), ('васильев', 4), (NULL,5);
 
CREATE TABLE test.myTable20 ("name" VARCHAR(10) NULL, "VALUE" INT NULL);
INSERT INTO test.myTable20 ("name", "VALUE") VALUES ('Иванов', 10), ('петров', 20), ('Сидоров', 30), ('васильев', 40), (NULL,50);
 
SELECT
    t1."name",
    t2."value",
    t3."value"
FROM
    test.myDict t1
LEFT JOIN
    test.myTable10 t2
ON
    --(lower(t1."name") = lower(t2."name")) OR (t1."name" IS NULL AND t2."name" IS NULL)
    NOT NULLIF(LOWER(t1."name"), 'null') IS DISTINCT FROM NULLIF(LOWER(t2."name"), 'null')
LEFT JOIN
    test.myTable20 t3
ON
    --(lower(t1."name") = lower(t3."name")) OR (t1."name" IS NULL AND t3."name" IS NULL)
    NOT NULLIF(LOWER(t1."name"), 'null') IS DISTINCT FROM NULLIF(LOWER(t3."name"), 'null')
;

На всякий случай хочу спросить, возможно ли обойти lower и написать по другому? Столбцов для ON много.
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 811
22.11.2023, 14:45
Можно избавиться от строк Null и сравнивать без применение механизма Null

SQL
1
COALESCE(t1."name",'') ilike COALESCE(t2."name",'')
Добавлено через 2 минуты
но нужно предусмотреть что бы в t2."name" не было служебных символов "%", "_", ""

Так что проще просто приводить все в нижний регистра
1
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
22.11.2023, 14:46  [ТС]
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.11.2023, 14:46
Помогаю со студенческими работами здесь

Использование IS NULL во вложенных SELECT
Доброго времени суток. Есть запрос такого вида: SELECT `time_entries`.`activity_id` AS `ActivityId`, `issues`.`root_id` AS...

Блин, для ЧЕГО НУЖНА Функция CREATE TABLE invoice( inv_id INT AUTO_INCREMENT NOT NULL , usr_id INT NOT NULL , prod_id INT NOT NULL , quantity INT NOT
Погуглив, так и не смог толком понять. Есть тут ГУРУ по mysql Которые могут на пальцах или на примере показать для чего она нужна. ...

Почему при NOT NULL default это NULL ?
Добрый день! Вопрос такой вдруг появился. При создании таблицы ввожу NOT NULL. Но когда просматриваю DESCRIPTION колонке Default вижу...

Почему в столбцах NOT NULL по умолчанию NULL ?
Добрых суток! Не могу понять такую вещь. Создаю столбцы и не пишу NOT NULL. В таком случае по умолчанию значения NULL. Но, даже,...

Не удалось вставить значение NULL в столбец "Sum"; в столбце запрещены значения NULL
Помогите пожалуйста с решением данной ошибки Не удалось вставить значение NULL в столбец "Sum", таблицы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru