有什么办法可以让 ALIAS 引用其他列值吗?

Is there any way where I can do ALIAS reference other column value?

我想弄清楚如何使用 ALIAS 来引用其他列的值。

我不确定是否可行,但它是否需要一些技巧才能完成?

如何执行类似下面代码的查询?

SELECT chd_value AS **chd_key value**
FROM table1 where chd_id = 1;

其中 chd_key 将替换为 table 中 "chd_key" 列的值。

所以我会得到类似于

的输出

.

这不会像您在图像中显示的那样为您提供两行,但如果您只想在一列中显示 key/value 对,请对 key/value 对进行串联:

SELECT (chd_key || ':' || chd_value) AS chd_pair
FROM table1 WHERE chd_id = 1;

按照要求以快速而肮脏的方式添加双引号:

SELECT ('"' || chd_key || '":"' || chd_value || '"') AS chd_pair
FROM table1 WHERE chd_id = 1;

它不漂亮,但它很简单而且有效。

根据作者打算使用的注释PHP,可以使用PDO来获得想要的输出。例如,假设 $pdo 是一个 PDO 实例:

 $pdo->query('SELECT chd_key, chd_value FROM table1 where chd_id = 1')
     ->fetchAll(PDO::FETCH_KEY_PAIR)

以上将生成具有预期输出的关联数组。第一列用作键,第二列用作值:

[
  'food' => 'chiken'
]

https://www.php.net/manual/en/book.pdo.php

https://www.php.net/manual/en/pdostatement.fetchall.php

关键字是"pivoting"或"cross tabulation"。

对于 chd_key 中有限的已知数量的不同值,最快的技术是 crosstab()。喜欢:

SELECT *
FROM   crosstab(
   'SELECT chd_id, chd_key, chd_value
    FROM   tbl
    where  chd_id = 1
    ORDER  BY 1'  -- ORDER BY redundant in this special case
  , $$VALUES ('food'), ('color'), ('gadget')$$
   ) AS ct (chd_id int, food text, color text, gadget text);

详细说明:

  • PostgreSQL Crosstab Query

但这不是完全动态的,SQL 很难做到这一点。参见:

  • Dynamic alternative to pivot with CASE and GROUP BY

一种简单地获得 "key":"value" 的方法就像你后来评论的那样:

SELECT format('"%s":"%s"', chd_key, chd_value) AS chd_pair
FROM tbl WHERE chd_id = 1;