О NULL
'anything' NOT LIKE NULL
дает NULL
, а не TRUE
.
И только TRUE
подходит для выражений фильтра в предложении WHERE
.
Большинство функций возвращают NULL
при вводе NULL
(есть исключения). Такова природа NULL
в любой правильной СУБД.
Если вам нужно одно выражение, вы можете использовать:
AND (column_default LIKE 'nextval%') IS NOT TRUE;
Однако вряд ли это короче или быстрее. Подробности в руководстве.
Правильный запрос
Ваш запрос по-прежнему ненадежен. Само по себе имя таблицы не является уникальным в базе данных Postgres, вам нужно дополнительно указать имя схемы или полагаться на текущий search_path
, чтобы найти в нем первое совпадение:
Связанный:
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'hstore1'
AND table_schema = 'public' -- your schema
AND (column_default IS NULL OR
column_default NOT LIKE 'nextval%');
Лучше, но все равно не пуленепробиваемый. Столбец по умолчанию, начинающийся с «nextval», еще не дает serial
. Видеть:
Чтобы быть уверенным, проверьте, принадлежит ли используемая последовательность столбцу с pg_get_serial_sequence(table_name, column_name)
.
Сам я редко использую информационную схему. Эти медленные, раздутые представления гарантируют переносимость между основными версиями и нацелены на переносимость на другие РСУБД, соответствующие стандартам. Но слишком многое в любом случае несовместимо. Oracle даже не реализует информационную схему (по состоянию на 2015 год).
Кроме того, в информационной схеме отсутствуют полезные столбцы, специфичные для Postgres. В этом случае я мог бы запросить системные каталоги следующим образом:
SELECT *
FROM pg_catalog.pg_attribute a
WHERE attrelid = 'table1'::regclass
AND NOT attisdropped -- no dropped (dead) columns
AND attnum > 0 -- no system columns
AND NOT EXISTS (
SELECT FROM pg_catalog.pg_attrdef d
WHERE (d.adrelid, d.adnum) = (a.attrelid, a.attnum)
AND d.adsrc LIKE 'nextval%'
AND pg_get_serial_sequence(a.attrelid::regclass::text, a.attname) <> ''
);
Быстрее и надежнее, но менее портативно.
Руководство:
В каталоге pg_attrdef
хранятся значения столбцов по умолчанию. Основная информация о столбцах хранится в pg_attribute
(см. ниже). Только столбцы, в которых явно указано значение по умолчанию (при создании таблицы или добавлении столбца), будут иметь здесь запись.
'table1'::regclass
использует search_path
для разрешения имени, что позволяет избежать двусмысленности. Вы можете квалифицировать имя схемы для отмены: 'myschema.table1'::regclass
.
Связанный:
person
Erwin Brandstetter
schedule
02.04.2014
IS NULL
илиIS NOT NULL
возвращаетNULL
вместо true или false в большинстве/во всех системах баз данных. - person Sam DeHaan   schedule 02.04.2014