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. 大多数函数在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 为了确保,检查使用的序列是否由具有 我自己很少使用信息模式.这些缓慢,臃肿的视图保证了主要版本的可移植性 – 并且旨在实现其他符合标准的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:
‘table1′:: regclass使用search_path来解析名称,这避免了歧义.您可以对名称进行模式限定以取代:’myschema.table1’:: regclass. 有关: > Find the referenced table name using table,field and schema name (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |