Sql-Server
MSSQL 中的 REGEXP_SUBSTR 等效項
我從 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 15
regexp_substr()
的實現與 Oracle 的實現幾乎相同。