Sql-Server

MSSQL 中的 REGEXP_SUBSTR 等效項

  • March 9, 2022

我從 Oracle DB 遷移到 Postgres/MS-SQL,我想使用 REGEXP_SUBSTR 等價於這些數據庫。我需要將此語句重寫為這些數據庫:

SELECT b.id,
      b.name,
      b.description,
      REGEXP_SUBSTR(b.description, '(st|ek)', 1, 1, NULL, 1) substring
FROM books b;

我能夠為 PostgreSQL 編寫這個語句:

SELECT b.id,
      b.name,
      b.description,
      (SELECT array_to_string(a, '') FROM REGEXP_MATCHES(b.description, '(st|ek) ', 'g') AS f(a) LIMIT 1) substring
FROM books b;

但是我不知道如何重寫為 MS-SQL 數據庫。我嘗試使用下面的語句,但是子字元串列返回了錯誤的結果。請問這個問題有什麼解決辦法嗎?

SELECT b.id,
          b.name,
          b.description,
          (SELECT SUBSTRING(b.description, PATINDEX('(st|ek)', CAST(b.description AS varchar)), LEN(b.description))) substring
FROM books b;

Postgres 的解決方案是使用substring()

substring('one two three four five' from '(\S+)')

產量one。與 Oracle 最大的區別regexp_substring()是您無法直接定位“第 n 個”事件。要獲得第二個單詞,您可以使用:

substring('one two three four five' from '\S+\s*(\S+)')

如果您嘗試訪問單詞(由空格分隔),則將字元串拆分為數組是另一種選擇:

(regexp_split_to_array('one two three four five', '\s+'))[1]

以上返回第一個單詞,[2] 將返回第二個單詞。正則表達式定義每個元素之間的分隔符(定界符)。


請注意,Postgres 15regexp_substr()的實現與 Oracle 的實現幾乎相同。

引用自:https://dba.stackexchange.com/questions/308476