postgresql 如何引用串联的列别名?

izkcnapc  于 2023-02-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(148)

我试图选择一个串联作为别名,然后在WHERE子句中引用该别名,但无法使其工作。

select concat(area_code, "-", phone_triad, "-", phone_quad) as phone_number, first_name, last_name
from info_table 
where phone_number in (<LIST OF NUMBERS>);
iibxawm4

iibxawm41#

就像已经注解过的,不能在WHERE子句中引用 * output * 列名,只能引用 * input * 列名。必须重复该表达式。请参见:

  • GROUP BY + CASE语句

但还有更多。
字符串用单引号引起来:'string'。请参阅:

  • 在PostgreSQL中插入带单引号的文本

如果你的表不是很小,你会希望提高索引的性能。你的 predicate 必须是"sargable"的。为此,你有两个基本的选择:

1.表达式索引

CREATE INDEX ON info_table ((area_code || '-' || phone_triad || '-' || phone_quad));

SELECT area_code || '-' || phone_triad || '-' || phone_quad AS phone_number
     , first_name, last_name
FROM   info_table
WHERE  area_code || '-' || phone_triad || '-' || phone_quad IN (<list OF numbers>);

请注意表达式area_code || '-' || phone_triad || '-' || phone_quad而不是原始的concat()表达式。为什么?请参阅:

  • 合并两列并添加为一个新列
  • 使用运算符""的字符串串联||"或format()函数

2.拆分输入

并对数字的一个或多个部分使用基本索引:

WITH nr AS (
   SELECT phone_number
        , split_part(phone_number, '-', 1) AS area_code
        , split_part(phone_number, '-', 2) AS phone_triad
        , split_part(phone_number, '-', 3) AS phone_quad
   FROM  (
      VALUES 
        ('123-456-789')  -- your input here
      , ('223-456-789')
      ) input(phone_number)
   )
SELECT nr.phone_number, i.first_name, i.last_name
FROM   nr
JOIN   info_table i USING (area_code, phone_triad, phone_quad);

参见:

  • 将逗号分隔的列数据拆分为其他列

要保留结果中找不到的输入数字,请使用LEFT JOIN而不是JOIN。然后,first_namelast_name会填入null值-如果至少有一列定义为NOT NULL,则null值与实际列值是不同的。
无论哪种方式,都必须正确处理null值、空字符串以及前导和尾随空格。

相关问题