sql – 具有NULL值的NOT LIKE的行为

前端之家收集整理的这篇文章主要介绍了sql – 具有NULL值的NOT LIKE的行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想获取表的所有列,除了类型为serial的列.最接近这个问题的查询我得出了这个:
SELECT column_name FROM information_schema.columns
WHERE table_name = 'table1' AND column_default NOT LIKE 'nextval%'

但问题是它还排除/过滤具有column_default空值的行.我不知道为什么Postgres的行为是这样的.所以我不得不将我的查询更改为以下内容

SELECT column_name FROM information_schema.columns
WHERE table_name = 'table1'
AND ( column_default IS NULL OR column_default NOT LIKE 'nextval%')

欢迎提出任何更好的建议或理由.

解决方法

关于NULL

‘nothing’NOT LIKE NULL产生NULL,而不是TRUE.
并且只有TRUE符合WHERE子句中的过滤器表达式.

大多数函数在NULL输入时返回NULL(有例外).这是任何适当的RDBMS中NULL的本质.

如果您需要单个表达式,可以使用:

AND   (column_default LIKE 'nextval%')  IS NOT TRUE;

然而,这几乎不会更短或更快. Details in the manual.

正确的查询

您的查询仍然不可靠.在Postgres数据库中,单独的表名不是唯一的,您需要另外指定模式名称,或者依赖当前的search_path来查找其中的第一个匹配项:

有关:

> How does the search_path influence identifier resolution and the “current schema”

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’开头的列默认值不会生成序列号.看到:

> Auto increment table column

为了确保,检查使用的序列是否由具有pg_get_serial_sequence(table_name,column_name)的列“拥有”.

我自己很少使用信息模式.这些缓慢,臃肿的视图保证了主要版本的可移植性 – 并且旨在实现其他符合标准的RDBMS的可移植性.但无论如何太多是不相容的. 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) <> ''
   );

更快,更可靠,但便携性更低.

The manual:

The catalog pg_attrdef stores column default values. The main
information about columns is stored in pg_attribute (see below). Only
columns that explicitly specify a default value (when the table is
created or the column is added) will have an entry here.

‘table1′:: regclass使用search_path来解析名称,这避免了歧义.您可以对名称进行模式限定以取代:’myschema.table1’:: regclass.

有关:

> Find the referenced table name using table,field and schema name
> Get the default values of table columns in Postgres?

原文链接:https://www.f2er.com/mssql/83884.html

猜你在找的MsSQL相关文章