簡體   English   中英

在特定字符SQL-Standard處拆分字符串

[英]Split string at specific character SQL-Standard

在我的SQL語句中,我必須從字符'_'處的字符串中提取子字符串。 字符串可以是例如'A_XXX''AB_XXX''ABC_XXXX',因此提取的子字符串應該像'A''AB''ABC'。

在Oracle中,使用substr()和instr()函數很容易:

select substr('AB_XXX', 1, instr('AB_XXX', '_')-1) as substring
from dual;

結果將是:

SUBSTRING
------------------------
AB

我需要此查詢來檢查特定子字符串是否在字符串數組中。

整個查詢看起來像:

select 'AB_XXX' from dual
where (instr('ABC_AB_A', substr('AB_XXX', 1, instr('AB_XXX', '_')-1))>0);

有沒有辦法在SQL-Standard中編寫它?

在此先感謝您的幫助。

編輯:

如果PostgreSQL提供了另一種功能,它也會有所幫助。 其余的可以用例如IN來解決。 真正重要的部分是獲得子串。

你的第二個例子有點混亂,因為你混合'ABC_AB_A''AB_XXX'不確定這是不是錯字。

但是,如果您只想在第一個_之前的所有字符,那么以下工作在Postgres:

left(col, strpos(col, '_') - 1)

或使用正則表達式:

substring(col from '([A-Z]+)(_{1})')

您也可以在Oracle中使用正則表達式:

regexp_substr(col, '([A-Z]+)(_{1})', 1, 1, 'i', 1)

Postgres的substring函數總是返回正則表達式的第一個捕獲組,而在Oracle中,您可以指定所需的組:這是regexp_substr()函數的最后一個參數。

SQLFiddle for Oracle: http ://sqlfiddle.com/#!4/b138c/1
Postfres的SQLFiddle: http ://sqlfiddle.com/#!15 / 4b2bb / 1

標准SQL字符串函數在以下位置描述: SQL字符串函數和運算符

有一個substring函數可以直接提取內容,而不必嵌套函數調用。 它在模式匹配中有詳細說明:

具有三個參數substring(來自轉義字符的模式的字符串)的子字符串函數提供了與SQL正則表達式模式匹配的子字符串的提取。 與SIMILAR TO一樣,指定的模式必須與整個數據字符串匹配,否則函數將失敗並返回null。 要指示成功時應返回的模式部分,模式必須包含兩次出現的轉義字符,后跟雙引號(“)。將返回與這些標記之間的模式部分匹配的文本。

在你的情況下:

select substring('AB_XX' from '#"%#"#_%' for '#');

結果:

substring 
-----------
 AB
(1 row)

語法有點奇怪,特別是因為_是單個字符的通配符所以必須引用它,但它是SQL標准。

對於更多人使用的語法,請考慮regexp_replace()或使用POSIX正則表達式的類似函數。

TL;博士

使用專門為此構建的split_part

split_part(string, '_', 1)

說明

引用此API文檔

SPLIT_PART()函數在指定的分隔符上拆分字符串並返回第n個子字符串。

3個參數是要拆分的字符串,分隔符和要返回的部分/子字符串編號(從1開始)。

因此,如果您有一個名為string的字段,其中包含AB_XXX類的AB_XXX並且您希望在_之前獲取所有內容,那么您可以將其拆分並獲取第一個部分/子字符串: split_part(string, '_', 1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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