產生額外的文字,我轉換BDE查詢(矛盾)的火鳥(2.5,不3.x中),我有它的一個非常方便的轉換:從字符串列中提取整數值與火鳥
select TRIM(' 1') as order1, CAST(' 1' AS INTEGER) AS order2 --> 1
select TRIM(' 1 bis') as order1, CAST(' 1 bis' AS INTEGER) AS order2 --> 1
然後由澆鑄值排序,則trimed值(ORDER order2,order1)提供給我的結果,我需要:
1
1 bis
2 ter
100
101 bis
但在火鳥鑄造一個不正確的整數會拋出一個異常,我沒有找到任何辦法以提供相同的結果。我想,我可以告訴大家一個數字是不是存在的東西像下面,但我無法找到一個方法來提取它...
TRIM(' 1 bis') similar to '[ [:ALPHA:]]*[[:DIGIT:]]+[ [:ALPHA:]]*'
[編輯]
我不得不處理其中文本是在號碼前,所以使用@ Arioch'The觸發我得到了這個偉大的運行情況:
SET TERM^;
CREATE TRIGGER SET_MYTABLE_INTVALUE FOR MYTABLE ACTIVE
BEFORE UPDATE OR INSERT POSITION 0
AS
DECLARE I INTEGER;
DECLARE S VARCHAR(13);
DECLARE C VARCHAR(1);
DECLARE R VARCHAR(13);
BEGIN
IF (NEW.INTVALUE is not null) THEN EXIT;
S = TRIM(NEW.VALUE);
R = NULL;
I = 1;
WHILE (I <= CHAR_LENGTH(S)) DO
BEGIN
C = SUBSTRING(S FROM I FOR 1);
IF ((C >= '0') AND (C <= '9')) THEN LEAVE;
I = I + 1;
END
WHILE (I <= CHAR_LENGTH(S)) DO
BEGIN
C = SUBSTRING(S FROM I FOR 1);
IF (C < '0') THEN LEAVE;
IF (C > '9') THEN LEAVE;
IF (C IS NULL) THEN LEAVE;
IF (R IS NULL) THEN R=C; ELSE R = R || C;
I = I + 1;
END
NEW.INTVALUE = CAST(R AS INTEGER);
END^
SET TERM ;^
有沒有在火鳥2.5本身會這樣做。你需要找到(或寫入)這樣做的UDF,或者在存儲過程中做一些hacky字符串操作。 –
請注意,這個問題是針對Firebird 2.5的。在3.0中,可以使用[SubString with Regular expressions](https://firebirdsql.org/file/documentation/release_notes/html/en/3_0/bk01ch09s05.html#rnfb30-dml-substring)。 – NineBerry
感謝@NineBerry編輯標題,當然BDE在我的請求中沒有任何目標......當然是的,我知道Firebird 3的改進......我認爲一個新的字段與整數值將是避免每次需要計算的最佳解決方案... – Darkendorf