postgresql - 在 PostgreSQL 中将行转换为数组
问题描述
我需要查询一个表,如
SELECT *
FROM table_schema.table_name
只有每一行需要是一个TEXT[]
与列值对应的数组值,该列值以TEXT
相同的顺序出现,因此SELECT *
假设表有列a
,我需要结果看起来像b
c
SELECT ARRAY[a::TEXT, b::TEXT, c::TEXT]
FROM table_schema.table_name
只是它不应该按名称显式列出列。理想情况下它应该看起来像
SELECT as_text_array(a)
FROM table_schema.table_name AS a
我想出的最好的看起来很丑,并且依赖于“hstore”扩展
WITH columnz AS ( -- get ordered column name array
SELECT array_agg(attname::TEXT ORDER BY attnum) AS column_name_array
FROM pg_attribute
WHERE attrelid = 'table_schema.table_name'::regclass AND attnum > 0 AND NOT attisdropped
)
SELECT hstore(a)->(SELECT column_name_array FROM columnz)
FROM table_schema.table_name AS a
我有一种感觉,必须有一种更简单的方法来实现这一点
更新 1
另一个实现相同结果但可以说与第一个查询一样丑陋和低效的查询受到@bspates答案的启发。它可能效率更低,但不依赖于扩展
SELECT r.text_array
FROM table_schema.table_name AS a
INNER JOIN LATERAL ( -- parse ROW::TEXT presentation of a row
SELECT array_agg(COALESCE(replace(val[1], '""', '"'), NULLIF(val[2], ''))) AS text_array
FROM regexp_matches(a::text, -- parse double-quoted and simple values separated by commas
'(?<=\A\(|,) (?: "( (?:[^"]|"")* )" | ([^,"]*) ) (?=,|\)\Z)', 'xg') AS t(val)
) AS r ON TRUE
离理想还很远
更新 2
我测试了目前存在的所有 3 个选项
- 使用
JSON
. 不依赖任何扩展,写的很短,通俗易懂,速度还可以。 - 使用
hstore
. 这种替代方法是最快的(比 100K 数据集上的方法快 10 倍以上JSON
),但需要扩展。hstore
一般来说,通过扩展是非常方便的。 - 用于解析ROW
regex
的 TEXT 表示。这个选项真的很慢。
解决方案
一个有点丑陋的 hack 是将行转换为 JSON 值,然后取消嵌套值并将其聚合回数组:
select array(select (json_each_text(to_json(t))).value) as row_value
from some_table t
这在某种程度上与您的 hstore hack 相同。
如果列的顺序很重要,那么使用json
andwith ordinality
可以用来保持:
select array(select val
from json_each_text(to_json(t)) with ordinality as t(k,val,idx)
order by idx)
from the_table t
推荐阅读
- apache-beam - Branching pipeline // fanout-fanin : Process each file in separate branch
- python - 如何将base64解码为单字节?
- r - 在 r 上递增的 for 循环
- html - Trouble Getting Div Elements Lined Up Correctly
- sql - JOIN 条件不能正常工作
- python - What to do when pyinstaller does not seem to be working?
- python - How to load object from pickle file without shadowing names from outer scope?
- swiftui - Navigation bar title stays inline in iOS 15
- r - R -find and replace within a script, iteratively
- material-ui - StylesProvider injectFirst 错误:元素类型无效:需要一个字符串(对于内置组件)或