Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回列名和不同的值_Sql_Postgresql_Distinct_Set Returning Functions - Fatal编程技术网

Sql 返回列名和不同的值

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 | | ... | ... | ... | 我想运行一

假设我在postgres中有一个简单的表,如下所示:

+--------+--------+----------+
|  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列表中所有集合返回函数的返回行数不应完全相同,那么新函数也不会偏离笛卡尔积,这是一个非常奇怪的行为。新的语法变体应优先于现在过时的语法变体:

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