[英]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.