rya*_*uck 3 postgresql pattern-matching functions set-returning-functions regex
我想尝试正则表达式匹配,null如果失败则返回。
以下查询尝试查找字符串中的第一个数字。结果会忽略带有 text 的条目'blah'。我更希望它返回一个null值。
这个问题可能与正则表达式无关,更多地与集合代数有关。我的预感是,有一种优雅的方法可以做到这一点,而不需要left join任何东西,尽管谷歌搜索被证明是徒劳的。
with test_data as (
select 'abc 123' as txt
union
select 'abc 456' as txt
union
select 'blah' as txt
)
select
txt,
(regexp_matches(txt, '\d+'))[1] as first_num
from
test_data
Run Code Online (Sandbox Code Playgroud)
虽然您的答案 解决了 的问题regexp_matches(),但更好的解决方案是首先使用更合适的函数来避免该问题:substring()
WITH test_data(txt) AS (
VALUES
(text 'abc 123')
, ('abc 456')
, ('blah')
)
SELECT txt, substring(txt FROM '\d+') AS first_num
FROM test_data;
Run Code Online (Sandbox Code Playgroud)
完全满足您的需要:返回字符串中的第一个匹配项或NULL不匹配。
substring(string FROM pattern)是标准的 SQL 语法。
不要将其与其他事情混淆或做其他事情。substring(string [FROM int] [FOR int])substring(string FROM pattern FOR escape)
您还可以使用更短、等效、当前未记录的 Postgres 实现substring(text, text)(使用逗号 ( ,) 代替FROM)。
用于regexp_matches()返回设置的所有匹配项。(请注意,单个正则表达式可以产生多个匹配项,因此是一组文本数组)。您仍然只能获得第一行,除非您添加标志来获取所有行(其他匹配项 - 如果有 - 对于相同的正则表达式)。有关的:'g'
FROM为了避免复杂化,在 Postgres 10 之前的版本中将返回集合的函数移动到列表中:
或者在 Postgres 10 或更高版本中使用regexp_match()以仅返回第一行。这也不会表现出原来的问题:
WITH test_data(txt) AS (
VALUES
(text 'abc 123')
, ('abc 456')
, ('blah')
)
SELECT txt, (regexp_match(txt, '\d+'))[1] AS first_num
from test_data;
Run Code Online (Sandbox Code Playgroud)
但仅用于substring()您的目的。
db<>在这里摆弄
| 归档时间: |
|
| 查看次数: |
7561 次 |
| 最近记录: |