Interbase - TRIM()
6 отговора
572 прегледа
Interbase - TRIM()
Здравейте!
Интересува ме, има ли такава функция и как се казва?
Понякога имам нужда от TRIM()-подобна функция, но така и не съм открил в Interbase. Основно ми трябва да събиране на няколко стрингови полета, но понякога и за други нужди.
Търсил съм в хелп-а, но без успех. Възможно е и да подминавам нещо, но от доста време се боря с това.
ЧеФо
Интересува ме, има ли такава функция и как се казва?
Понякога имам нужда от TRIM()-подобна функция, но така и не съм открил в Interbase. Основно ми трябва да събиране на няколко стрингови полета, но понякога и за други нужди.
Търсил съм в хелп-а, но без успех. Възможно е и да подминавам нещо, но от доста време се боря с това.
ЧеФо
Re: Interbase - TRIM()
За FB1.x
SUBSTRING( <string expr> FROM <pos> [FOR <length>])
Нещо подобно има и в IB7 (може би още в IB6.5)
Но за конкатенация (ако това значи събиране) на няколко стрингови полета това не ти трябва. Използвай ||
Напр.
field_FirstName || ' ' || field_LastName || ' да сложи ' || :BeerQtty || ' бири '
SUBSTRING( <string expr> FROM <pos> [FOR <length>])
Нещо подобно има и в IB7 (може би още в IB6.5)
Но за конкатенация (ако това значи събиране) на няколко стрингови полета това не ти трябва. Използвай ||
Напр.
field_FirstName || ' ' || field_LastName || ' да сложи ' || :BeerQtty || ' бири '
Редактирано от NDeu на
Re: Interbase - TRIM()
field_FirstName || ' ' || field_LastName || ' да сложи ' || :BeerQtty || ' бири '
е логично, наистина.
"Иван Иванов да сложи 5 бири"
Но, ако field_FirstName е празно, резултата, който получавам е
"__________ Иванов да сложи 5 бири"
^-- тук е запълнено с толкова интервали, колкото е дължината на полето.
Ако второто поле от твоя пример е празно (без стойност), също се получава резултат с много интервали посредата.
Това искам да предотвратя.
ЧеФо
е логично, наистина.
"Иван Иванов да сложи 5 бири"
Но, ако field_FirstName е празно, резултата, който получавам е
"__________ Иванов да сложи 5 бири"
^-- тук е запълнено с толкова интервали, колкото е дължината на полето.
Ако второто поле от твоя пример е празно (без стойност), също се получава резултат с много интервали посредата.
Това искам да предотвратя.
ЧеФо
Re: Interbase - TRIM()
Да, това е по принцип добре, в повечето случаи върши работа. При създаването на базата създадох подобен тест (по-долу).
Но проблема остава, когато в примера полето V1 е празно - в резултата пак има един излишен интервал преди стойността от второто поле и се получава "_Иванов", вместо желаното "Иванов".
Ако имаше TRIM функция, щях да я приложа върху целия резултатен израз.
CREATE TABLE TEST(
C1 CHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
C2 CHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
CC CHAR(20) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
V1 VARCHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
V2 VARCHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
VV VARCHAR(20) CHARACTER SET WIN1251 COLLATE PXW_CYRL)
SELECT * FROM TEST
C1;C2;CC;V1;V2;VV
Иван;Иванов;;Иван;Иванов;
;Иванов;;;Иванов;
UPDATE TEST
SET CC = C1 || ' ' || C2,
VV = V1 || ' ' || V2
SELECT * FROM TEST
C1;C2;CC;V1;V2;VV
Иван;Иванов;Иван Иванов;Иван;Иванов;Иван Иванов
;Иванов; Иванов;;Иванов; Иванов
ЧеФо
Но проблема остава, когато в примера полето V1 е празно - в резултата пак има един излишен интервал преди стойността от второто поле и се получава "_Иванов", вместо желаното "Иванов".
Ако имаше TRIM функция, щях да я приложа върху целия резултатен израз.
CREATE TABLE TEST(
C1 CHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
C2 CHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
CC CHAR(20) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
V1 VARCHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
V2 VARCHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
VV VARCHAR(20) CHARACTER SET WIN1251 COLLATE PXW_CYRL)
SELECT * FROM TEST
C1;C2;CC;V1;V2;VV
Иван;Иванов;;Иван;Иванов;
;Иванов;;;Иванов;
UPDATE TEST
SET CC = C1 || ' ' || C2,
VV = V1 || ' ' || V2
SELECT * FROM TEST
C1;C2;CC;V1;V2;VV
Иван;Иванов;Иван Иванов;Иван;Иванов;Иван Иванов
;Иванов; Иванов;;Иванов; Иванов
ЧеФо
Re: Interbase - TRIM()
Тогава UDF
/*****************************************
*
* l t r i m
*
*****************************************
*
* Functional description:
* Removes leading spaces from the input
* string.
* Note: This function is NOT limited to
* receiving and returning only 80 characters,
* rather, it can use as long as 32767
* characters which is the limit on an
* INTERBASE character string.
*
*****************************************/
DECLARE EXTERNAL FUNCTION ltrim
CSTRING(80)
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT 'IB_UDF_ltrim' MODULE_NAME 'ib_udf';
/*****************************************
*
* l t r i m
*
*****************************************
*
* Functional description:
* Removes leading spaces from the input
* string.
* Note: This function is NOT limited to
* receiving and returning only 80 characters,
* rather, it can use as long as 32767
* characters which is the limit on an
* INTERBASE character string.
*
*****************************************/
DECLARE EXTERNAL FUNCTION ltrim
CSTRING(80)
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT 'IB_UDF_ltrim' MODULE_NAME 'ib_udf';