[英]Can I use wildcards in Firebird POSITION function
我正在使用 Firebird 2.1。
我的工作訂單號可能有 1 或 2 個字母字符,然后是 4 或 5 個數字,然后可能是帶有 1 個字母字符和 2 個數字的前綴。
我想提取中間的4-5位數字。
我嘗試了以下方法來查找數字字符,但它返回 0:
POSITION('%[0-9]%',JOBHEADER.ORDERNUMBER,1) AS "FIRST NUMBER"
我不確定是否可以在POSITION
函數中使用通配符。 我想我可以嘗試檢查數字的第二個或第三個字符,但我真的需要通配符功能,然后在找到第一個數字的位置后找到下一個字母。 或者也許有另一種解決方案來提取數字。
我發現了類似的東西:
CASE WHEN SUBSTRING(ordernumber FROM 2 FOR 5) SIMILAR TO '[0-9]+'
THEN SUBSTRING(ordernumber FROM 2 FOR 5)
ELSE SUBSTRING(ordernumber FROM 3 FOR 5)
END as PROJECTNUMBER
但是由於數字可能從前 5 個字符開始,然后 if/case 語句開始變得非常大。
不,你不能用POSITION
做到這一點。 位置搜索給定字符串中的確切子字符串。 但是,對於 Firebird 3,您可以使用SUBSTRING
和正則表達式來提取值,例如:
substring(ordernumber similar '%#"[[:DIGIT:]]+#"%' escape '#')
正則表達式必須覆蓋整個字符串,而#"
包含要提取的術語( #
是明確定義的轉義符號)。您可能需要使用更復雜的模式,如[^[:DIGIT:]]*#"[[:DIGIT:]]+#"([^[:DIGIT:]]%)?
以避免貪婪的邊緣情況。
如果您知道該模式始終是 1 或 2 個字母、4 或 5 位要提取的數字,可能后跟 1 個字母和 2 個數字,您還可以使用[[:ALPHA:]]{1,2}#"[[:DIGIT:]]{4,5}#"([[:ALPHA:]][[:DIGIT:]]{1,2})?
. 如果模式不匹配,則返回null
。
也可以看看:
請注意,Firebird 支持的 SQL 標准正則表達式語法有點奇怪,並且不如其他語言中常見的正則表達式強大。
要使用 PSQL 解決此問題,在 Firebird 2.1 下,您可以使用以下內容:
create or alter procedure extract_number(input_value varchar(50))
returns (output_value bigint)
as
declare char_position integer = 0;
declare number_string varchar(20) = '';
declare current_char char(1);
begin
while (char_position < char_length(input_value)) do
begin
char_position = char_position + 1;
current_char = substring(input_value from char_position for 1);
if ('0' <= current_char and current_char <= '9') then
begin
number_string = number_string || current_char;
end
else if (char_length(number_string) > 0) then
begin
-- switching from numeric to non-numeric, found first number occurrence in string
leave;
end
end
output_value = iif(char_length(number_string) > 0, cast(number_string as bigint), null);
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.