4

如何创建一个 sql 选择语句,其中选择列名是另一个表的行中的值(我使用的是 postgresql)?我有一个带有语言代码的语言表:

language
========
id    code  name
-------------------
1     en    English
2     fr    French
3     it    Italian

country
=======
id    en    fr    it   other_columns
------------------------------------
1     ...
2     ...

我想从国家表中选择 id 和所有语言列,它们列在语言表中。就像是:

SELECT id, (SELECT code FROM language) FROM country

所以我实际上最终得到:

SELECT id, en, fr, it from country

谢谢!

4

2 回答 2

2

这被称为“枢轴”或“交叉表”,是众所周知的 SQL 不好的地方。PostgreSQL 提供了一个有点帮助的扩展,尽管它使用起来并不美观——看看扩展中的crosstab函数tablefunc

搜索标记以及标记会找到更多信息。例如:

于 2013-06-15T07:49:13.923 回答
1

这是部分答案。以下行为您提供了您正在寻找的 SQL。也许 PL/pgSQL 的 EXECUTE 实际上可以为您运行它。

SELECT 'SELECT id, ' 
    || (SELECT array_to_string(array_agg(code),', ') FROM LANGUAGE) 
    || 'FROM country';

一些测试数据:

CREATE TABLE country (id integer, en text, fr text, it text, es text, de text);
INSERT INTO country (id, en, fr, it, es, de) 
VALUES (1, 'Hello', 'Bonjour', 'Buon giorno', 'Buenas dias', 'Guten Tag');

CREATE TABLE language (id integer, code text, name text);
INSERT INTO language (id, code, name) 
VALUES (1, 'en', 'English'), (2, 'fr', 'French'), (3, 'it', 'Italian');
于 2013-06-15T10:17:36.323 回答