PostgreSQL如何根据trimestre列条件选取其他列对应值
报错原因
你在CASE表达式中写的子查询(SELECT 202201 FROM siila_01)会返回siila_01全表所有行的202201列值,并非当前计算行对应的列值,只要siila_01表数据量超过1行,就会触发你遇到的more than one row returned by a subquery used as an expression报错,你的判断是正确的。
实际上你在外层查询中已经可以直接访问到当前行的202104、202201列,完全不需要额外嵌套子查询取值,直接引用对应列名即可。
修正后的查询语句
SELECT *, CASE WHEN trimestre = '22T1' THEN "202201" WHEN trimestre = '21T4' THEN "202104" END AS ocupante FROM ( SELECT *, CASE WHEN série = 1 THEN '22T1' WHEN série = 2 THEN '21T4' END AS trimestre FROM ( SELECT *, CONCAT(siila_id, galpão, módulo) AS id_conjunto, generate_series(1,2) AS série FROM siila_01 ) AS sub_01 ) AS sub_02;
注意事项
- 你的列名是数字开头的
202104、202201,在PostgreSQL中引用这类不符合常规标识符命名规则的列名时,必须用双引号包裹,否则Postgres会把它识别为数字常量,无法读取到对应列的存储值。 - 如果后续需要新增更多季度的匹配规则,直接在
CASE语句中追加WHEN分支即可,例如要匹配22T2对应202204列的值,只需新增一行WHEN trimestre = '22T2' THEN "202204"。
内容的提问来源于stack exchange,提问作者palm_e
相关产品推荐
相关产品推荐

