在 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;
请注意,我还使用 coalesce
将 NULL
(如果没有匹配项,我们从 regexp_matches
子查询中得到)转换为空 JSON 数组。
【讨论】:
以上是关于在 select 中使用 regexp_matches 查询返回空结果集的主要内容,如果未能解决你的问题,请参考以下文章
regexp_matches 在 plpgsql 函数中返回 NULL
Google Big Query 中 REGEXP_MATCH 的奇怪行为
BigQuery 为 REGEXP_MATCH 或 _EXTRACT 返回 null