Vertica REGEXP_SUBSTR使用/ g标志

时间:2018-03-06 11:54:06

标签: regex vertica

我试图在字符串中'='之前提取所有出现的单词,我试图使用此正则表达式var event = { 'summary': 'This is a test Calendar invite using NodeJS', 'location': 'Under the Bridge', 'description': 'I dont ever wanna feel Like I did that day But take me to the place I love Take me all the way', 'start': { 'dateTime': '2018-02-25T12:58:05-07:00', 'timeZone': 'America/Los_Angeles', }, 'end': { 'dateTime': '2018-02-26T06:00:00-07:00', 'timeZone': 'America/Los_Angeles', }, 'recurrence': [ 'RRULE:FREQ=DAILY;COUNT=2' ], 'attendees': [ {'email': 'rhcp@gmail.com'} ], 'reminders': { 'useDefault': true } }; 但它返回null,当我删除第一个'/'和最后一个'/ g'它只返回一次出现,这就是为什么我需要全局标志,任何建议?

1 个答案:

答案 0 :(得分:0)

正如Wiktor指出的那样,默认情况下,您只能获得REGEXP_SUBSTR()调用中的第一个字符串。但你可以得到第二,第三,第四等 例如,嵌入到SQL中,您需要以与在perl中处理它们的方式不同的方式处理正则表达式。模式只是模式,修饰符去其他地方,你不能使用$n来获得第n个被捕获的子表达式,你需要以特定的方式进行以获得第n个匹配模式等。

诀窍是使用内联创建的索引表CROSS JOIN您查询的表,该表包含与您期望出现的模式一样多的连续整数 - 以及更多安全性。 Vertica的REGEXP_SUBSTR()调用允许使用其他参数来执行此操作。见这个例子:

WITH
-- one exemplary input row; concatenating substrings for 
-- readability
input(s) AS (
SELECT 'DRIVER={Vertica};COLUMNSASCHAR=1;CONNECTIONLOADBALANCE=True;'
     ||'CONNSETTINGS=set+search_path+to+public;DATABASE=sbx;'
     ||'LABEL=dbman;PORT=5433;PWD=;SERVERNAME=127.0.0.1;UID=dbadmin;'
)
,
-- an index table to CROSS JOIN with ... maybe you need more integers ...
loop_idx(i) AS (
      SELECT  1
UNION SELECT  2
UNION SELECT  3
UNION SELECT  4
UNION SELECT  5
UNION SELECT  6
UNION SELECT  7
UNION SELECT  8
UNION SELECT  9
UNION SELECT 10
)
,
-- the query containing the REGEXP_SUBSTR() call
find_token AS (
SELECT
  i                    -- the index from the in-line index table, needed 
                       -- for ordering the outermost SELECT 
, REGEXP_SUBSTR (
    s                  -- the input string
  , '(\w+)='           -- the pattern  - a word followed by an equal sign; capture the word
  , 1                  -- start from pos 1
  , i                  -- the i-th occurrence of the match
  , ''                 -- no modifiers to regexp
  , 1                  -- the first and only sub-pattern captured
  ) AS token
  FROM input CROSS JOIN loop_idx -- the CROSS JOIN with the in-line index table
)
-- the outermost query filtering the non-matches - the empty strings - away...
SELECT
  token
FROM find_token
WHERE token <> ''
ORDER BY i
;

每个找到的模式的结果将是一行:

token
DRIVER
COLUMNSASCHAR
CONNECTIONLOADBALANCE
CONNSETTINGS
DATABASE
LABEL
PORT
PWD
SERVERNAME
UID

你可以在现代SQL中做各种各样的事情 - 但你需要坚持SQL和关系范式 - 这就是全部......

开心玩......