在 select 中使用 regexp_matches 查询返回空结果集

Posted

技术标签:

【中文标题】在 select 中使用 regexp_matches 查询返回空结果集【英文标题】:Query with regexp_matches in select returns empty result set 【发布时间】:2016-09-27 16:39:45 【问题描述】:

我有以下 SQL:

SELECT code, name
ARRAY_TO_JSON(regexp_matches(code, '^(.*?)(24)(.*)$','i')) AS match_code,
ARRAY_TO_JSON(regexp_matches(name, '^(.*?)(24)(.*)$','i')) AS match_name
FROM manufacturer
WHERE (code  ~* '^(.*?)(24)(.*)$' OR name  ~* '^(.*?)(24)(.*)$')
ORDER BY name;

表中有如下记录:

code | name
-------------
24   | Item 24

查询的结果是:

code | name    | match_code   | match_name
-------------------------------------------------
24   | Item 24 | ["","24",""] | ["Item ","24",""]

然后我在查询中将字符串 '24' 替换为 'Item',我希望得到这样的结果:

code | name    | match_code   | match_name
-------------------------------------------------
24   | Item 24 | []           | ["", "Item ","24"]

但结果是:

Empty result set

如果不匹配,函数 regexp_matches 可能不返回任何行。

如何修复查询,使其即使在 regexp_matches 不匹配时也能返回行?

提前致谢。

【问题讨论】:

【参考方案1】:

regexp_matches 返回一个setof text[],即一个表,在SELECT 中将其用作输出表达式有时会令人困惑。您可以创建一个子查询,以便将其移至FROM 子句。试试这个:

SELECT
    code,
    name,
    coalesce(array_to_json((SELECT * FROM regexp_matches(code, '^(.*?)(24)(.*)$','i'))),'[]') AS match_code,
    coalesce(array_to_json((SELECT * FROM regexp_matches(name, '^(.*?)(24)(.*)$','i'))),'[]') AS match_name
FROM manufacturer
WHERE (code  ~* '^(.*?)(24)(.*)$' OR name  ~* '^(.*?)(24)(.*)$')
ORDER BY name;

请注意,我还使用 coalesceNULL(如果没有匹配项,我们从 regexp_matches 子查询中得到)转换为空 JSON 数组。

【讨论】:

以上是关于在 select 中使用 regexp_matches 查询返回空结果集的主要内容,如果未能解决你的问题,请参考以下文章

regexp_matches 在 plpgsql 函数中返回 NULL

Google Big Query 中 REGEXP_MATCH 的奇怪行为

BigQuery 为 REGEXP_MATCH 或 _EXTRACT 返回 null

正则表达式 - 如何从列表中选择第一项

在 Redshift 中使用 regex_match 的问题

如何在 MS 访问中运行 Regex(如果支持)? [复制]