[英]How to capture regex first occurence and interpolate into string with postgreSQL
我正在尝试将以“ CityName”开头的字符串中的数字连接成一个单独的字符串。 我有串联部分。 我的问题是能够从正则表达式访问匹配项,我在rails中有一个正则表达式,看起来像/CityName\\s*(\\d+)/i
。 我是regex的新手,我很难把头围在文档上。 但是我假设此正则表达式将在CityName
案例后集中找到任何数字。 然后,如果它与我的模型上的属性匹配,则会对其进行插值。
regex = /CityName\s*(\d+)/i
if line_1 =~ regex
"C#{$1}"
...
end
但是在执行过程中,由于我必须遍历许多记录,因此它的速度正在减慢。 我在psql中有一个查询,它将执行我需要的计算,但是我很难实现此正则表达式替换。 到目前为止,我的尝试如下:
CASE
when addr.line_1 ~* 'CityName\s*(\d+)' then 'C' || regex_matches('CityName\s*(\d+)')[0]
...
我很难找到一种解决方案来抓住第一次出现的正则表达式匹配项。 谢谢你的提示:D
编辑:如果该字符串包含“ CityName”,我试图从字符串中获取“ CityName”之后的数字最终,我需要使用正则表达式以及如何用“ C”联系数字的帮助
您的问题还不清楚。 您是要添加数字到您的选择中还是要基于数字过滤记录?
如果只想选择它们:
Address.select(%q{(regexp_matches(addr.line_1, 'CityName\s*(\d+)'))[1] as digits})
.map(&:digits)
如果要基于以下条件进行过滤:
Address.where(%q{addr.line_1 ~ 'CityName\s*(\d+)'}).map &:email
.map(&:line_1)
还有一些注意事项:
得到它了! 终于能够弄清楚正则表达式。 WHEN addr.line_1 ~* '(?i)CityName\\s*(\\d+)' THEN 'C' || (SELECT (regexp_matches(addr.line_1, '(?i)CityName\\s*(\\d+)'))[1])
WHEN addr.line_1 ~* '(?i)CityName\\s*(\\d+)' THEN 'C' || (SELECT (regexp_matches(addr.line_1, '(?i)CityName\\s*(\\d+)'))[1])
(?i)
允许对CityName
进行不区分大小写的匹配,然后进行串联。 感谢@ ti6on指出与postgres的索引差异:D
看来您需要子查询或WITH查询:
SELECT tbl1.col1, sum(...), min(...) FROM (SELECT ..., CASE ...yourregex stuff... END col1 FROM ...) tbl1 GROUP BY 1;
WITH tbl1 AS (SELECT ..., CASE ...yourregex stuff... END col1 FROM ...) SELECT t.col1, sum(...) FROM tbl1 t GROUP BY 1;
如果经常需要它们,则还可以从查询中创建视图或创建临时表,然后可以在以后的查询中使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.