에위한 추가적인 텍스트와 문자열 열에서 정수 값을 추출하고 난 그것에 매우 편리한 변환이 있습니다내가 (3.X, 2.5되지 않음) 파이어 버드에 BDE 쿼리 (역설)를 변환하고있어
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 값 (주문 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를 찾거나 쓰거나 저장 프로 시저에서 해킹 문자열 조작을 수행해야합니다. –
이 질문은 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