![](/img/trans.png)
[英]How to split a string at a specific character but not replace that character?
[英]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正則表達式的類似函數。
使用專門為此構建的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.