Sql 返回列名和不同的值
假设我在postgres中有一个简单的表,如下所示:Sql 返回列名和不同的值,sql,postgresql,distinct,set-returning-functions,Sql,Postgresql,Distinct,Set Returning Functions,假设我在postgres中有一个简单的表,如下所示: +--------+--------+----------+ | Car | Pet | Name | +--------+--------+----------+ | BMW | Dog | Sam | | Honda | Cat | Mary | | Toyota | Dog | Sam | | ... | ... | ... | 我想运行一
+--------+--------+----------+
| Car | Pet | Name |
+--------+--------+----------+
| BMW | Dog | Sam |
| Honda | Cat | Mary |
| Toyota | Dog | Sam |
| ... | ... | ... |
我想运行一个sql查询,该查询可以在第一列中返回列名,在第二列中返回唯一值。例如:
+--------+--------+
| Col | Vals |
+--------+--------+
| Car | BMW |
| Car | Toyota |
| Car | Honda |
| Pet | Dog |
| Pet | Cat |
| Name | Sam |
| Name | Mary |
| ... | ... |
:
但我对代码理解不够,不知道如何将列名附加到另一列中
可能是与上面显示的“查询4b”相结合的子查询?
与
row_to_json()
和json_each_text()
您可以在不指定列数和列名的情况下执行此操作:
select distinct key as col, value as vals
from (
select row_to_json(t) r
from a_table t
) t,
json_each_text(r)
order by 1, 2;
。Postgres出于历史原因支持它,但由于postgres9.3引入了
LATERAL
,它在很大程度上已经过时了。我们也可以在这里使用它:
SELECT x.col, x.val
FROM tbl, LATERAL (VALUES ('car', car)
, ('pet', pet)
, ('name', name)) x(col, val)
GROUP BY 1, 2
ORDER BY 1, 2;
您将发现下面讨论的横向(值…
技术。只要一听到第一个答案就不要停止阅读
直到Postgres9.4之前,仍然存在一个例外情况:“并行unest”需要在SELECT
列表中组合多个集合返回函数。Postgres 9.4也带来了一个消除这种必要性的方法。更多:
SELECT DISTINCT x.*
FROM tbl t, unnest('{car, pet, name}'::text[]
, ARRAY[t.car, t.pet, t.name]) AS x(col, val)
ORDER BY 1, 2;
也比两个unnest()
并行调用更短更快
返回:
col | val
------+--------
car | BMW
car | Honda
car | Toyota
name | Mary
name | Sam
pet | Cat
pet | Dog
DISTINCT
或groupby
,这两种方法都有助于完成任务。这很完美。非常感谢。
SELECT DISTINCT x.*
FROM tbl t, unnest('{car, pet, name}'::text[]
, ARRAY[t.car, t.pet, t.name]) AS x(col, val)
ORDER BY 1, 2;
col | val
------+--------
car | BMW
car | Honda
car | Toyota
name | Mary
name | Sam
pet | Cat
pet | Dog