簡體   English   中英

我可以在 Firebird POSITION 函數中使用通配符嗎

[英]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

要使用 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.

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