如何选择Postgresql中不包含某个子字符串的所有列?

时间:2017-12-09 02:15:38

标签: sql postgresql

如果我有一个包含这样的列名的表:

name,
name_raw,
item,
item_raw,
message,
message_raw
...
... etc.

如何选择不以_raw动态结束的每一列?

是这样的:

SELECT
   [SOME REGEX LOGIC HERE]
FROM
   mytable

或类似的可能吗?

2 个答案:

答案 0 :(得分:1)

如果您有很多列无法编写(静态)查询,则可能需要更改数据库的模式。

如果您无法更改架构,这是一个利用postgresql的JSON功能的快速而肮脏的解决方案。它不会返回包含多个列的传统表,而是返回包含json对象的单个列,这些对象包含原始表中名称以_raw结尾的所有列。

SELECT (
    SELECT json_object_agg(key,value)
    FROM json_each(to_json(t))
    WHERE key ~ 'raw$'
) FROM mytable;

这个想法是将每一行从mytable转换为JSON对象,然后使用JSON函数来过滤对象的成员。

答案 1 :(得分:1)

使用信息架构,例如

SELECT column_name
FROM information_schema.columns
WHERE table_schema = 'my_schema'
AND table_name   = 'mytable'
AND NOT column_name LIKE '%\_raw'

请注意,因为下划线本身是一个查询通配符,它​​需要"转义"