我想获取表中除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%')
欢迎提出任何更好的建议或理由。
2条答案
按热度按时间x8goxv8g1#
大约
null
'anything' NOT LIKE null
产生null
,而不是true
。并且在
WHERE
子句中,只有true
才有资格使用筛选表达式。大多数函数在
null
输入时返回null
(也有例外),这是null
在任何RDBMS中的本质。如果您需要一个 * 单一 * 表达式,您 * 可以 * 使用:
不过,这并没有缩短或缩短。Details in the manual.
正确的查询
您的查询仍然不可靠。在Postgres数据库中,表名本身并不唯一,您需要另外指定模式名,或者依赖当前的
search_path
来查找其中的第一个匹配项:相关:
更好,但仍然不是防弹的。以'nextval'开头的列默认值还不能生成
serial
。请参见:为了确保这一点,请检查使用中的序列是否由
pg_get_serial_sequence(table_name, column_name)
列"拥有"。我自己很少使用信息模式。那些缓慢、臃肿的视图保证了跨主要版本的可移植性--目的是移植到其他符合标准的RDBMS。但无论如何,有太多东西是不兼容的。甲骨文甚至没有实现信息模式(截至2015年)。
此外,信息模式中缺少有用的PostgreSQL特定列。对于这种情况,我可能会查询系统目录,如下所示:
更快、更可靠,但便携性较差。
The manual:
目录
pg_attrdef
存储列的默认值。列的主要信息存储在pg_attribute
中(见下文)。只有显式指定默认值的列(在创建表或添加列时)才会在此处有条目。'table1'::regclass
使用search_path
解析名称,这样可以避免歧义。您可以对名称进行架构限定以否决:'myschema.table1'::regclass
.相关:
kb5ga3dv2#
我认为您可以用途: