You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL11同一查询内对新生成列执行字符串函数的解决方法

报错原因

PostgreSQL的SQL执行逻辑中,SELECT列表里的别名定义仅在该查询的ORDER BY、DISTINCT等后续阶段生效,同一层级SELECT列表内的后续表达式无法引用前面定义的别名,你在REGEXP_MATCHES里直接用刚定义的id别名,执行时该别名还未完成计算,因此会报列不存在的错误。

视图实现方案

你可以通过正则捕获组一次性提取所需字段,无需嵌套多层查询,创建视图的语句如下:

CREATE OR REPLACE VIEW labels_view AS
SELECT
    descr,
    (REGEXP_MATCH(descr, '^(\d+)([A-Za-z]?)_(.*)$'))[1] AS id,
    NULLIF((REGEXP_MATCH(descr, '^(\d+)([A-Za-z]?)_(.*)$'))[2], '') AS rate,
    (REGEXP_MATCH(descr, '^(\d+)([A-Za-z]?)_(.*)$'))[3] AS name
FROM labels;

如果你更偏好分层拆分的写法,也可以用子查询先提取前缀和后缀,再拆分得到id和rate:

CREATE OR REPLACE VIEW labels_view AS
SELECT
    descr,
    REGEXP_REPLACE(prefix, '[^0-9]', '', 'g') AS id,
    REGEXP_REPLACE(prefix, '[0-9]', '', 'g') AS rate,
    suffix AS name
FROM (
    SELECT
        descr,
        SPLIT_PART(descr, '_', 1) AS prefix,
        SPLIT_PART(descr, '_', 2) AS suffix
    FROM labels
) t;

两种写法都能适配你给出的示例数据,创建完成后直接查询labels_view即可获得所需的4个字段。

内容的提问来源于stack exchange,提问作者refriedjello

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:15:04