如何提取字符串中的所有数字?
示例输入:
预期产出:
使用第一个7nr-6p
:
select regexp_split_to_array('7nr-6p', '[^0-9]') AS new_volume from mytable;
给予:{7,"","",6,""} // Why is a numeric-only match returning spaces?
select regexp_matches('7nr-6p', '[0-9]*'::text) from mytable;
给予:{7} // Why isn't this continuing?
select regexp_matches('7nr-6p', '\d'::text) from mytable;
给予:{7}
select NULLIF(regexp_replace('7nr-6p', '\D',',','g'), '')::text from mytable;
给予:7,,,6,
答案 0 :(得分:2)
以下查询:
select regexp_split_to_array(regexp_replace('7nr-6p', '^[^0-9]*|[^0-9]*$', 'g'), '[^0-9]+')
AS new_volume from mytable;
“修剪”前缀和后缀非数字,并按剩余的非数字拆分。
select regexp_matches('7nr-6p', '[0-9]*'::text) from mytable;
给予:
{7} // Why isn't this continuing?
因为没有'g'
标志,正则表达式会在第一场比赛时停止。
添加'g'
标志:
select regexp_matches('7nr-6p', '[0-9]*'::text, 'g') from mytable;
答案 1 :(得分:1)
您可以替换所有文本然后拆分:
Core was generated by '/usr/local/bin/some-executable'
这会返回SELECT regexp_split_to_array(
regexp_replace('7nr-6p', '[a-zA-Z]', '','g'),
'[^0-9]'
)
答案 2 :(得分:1)
SELECT id, (regexp_matches(string, '\d+', 'g'))[1]::int AS nr
FROM (
VALUES
(1, '7nr-6p')
, (2, '12c-18L')
, (3, '12nr-24L')
, (4, '11nr-12p')
) tbl(id, string);
结果:
id | nr
----+----
1 | 7
1 | 6
2 | 12
2 | 18
3 | 12
3 | 24
4 | 11
4 | 12
我希望它们在一个单元格中,以便我可以根据需要提取它们
SELECT id, trim(regexp_replace(string, '\D+', ',', 'g'), ',') AS nrs
FROM (
VALUES
(1, '7nr-6p')
, (2, '12c-18L')
, (3, '12nr-24L')
, (4, '11nr-12p')
) tbl(id, string);
结果:
id | nrs
----+-------
1 | 7,6
2 | 12,18
3 | 12,24
4 | 11,12
dbfiddle here
答案 3 :(得分:1)
这是一个更强大的解决方案
CREATE OR REPLACE FUNCTION get_ints_from_text(TEXT) RETURNS int[] AS $$
select array_remove(regexp_split_to_array($1,'[^0-9]+','i'),'')::int[];
$$ LANGUAGE SQL IMMUTABLE;
实施例
select get_ints_from_text('7nr-6p'); -- 7,6
-- also resilient in situations like
select get_ints_from_text('-7nr--6p'); -- 7,6
这是一个尝试
的链接http://sqlfiddle.com/#!17/c6ac7/2
我觉得将这个功能包装成一个不可变的函数是谨慎的。这是一个纯函数,一个不会改变数据的函数和一个在给定相同输入的情况下返回相同结果的函数。标记为“不可变”的不可变函数具有性能优势。
通过使用函数,我们也从抽象中受益。如果将来需要改进此功能,则需要更新一个来源。
有关不可变函数的更多信息,请参阅
https://www.postgresql.org/docs/10/static/sql-createfunction.html