簡體   English   中英

如何捕獲正則表達式的首次出現並使用PostgreSQL插入到字符串中

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

還有一些注意事項:

  • 嚴格選擇數字大小寫並沒有任何意義。 數字沒有大小寫。
  • PostgreSQL數組從1而不是0開始。

得到它了! 終於能夠弄清楚正則表達式。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM