Начало » Использование СУБД » Firebird, HQbird, InterBase » Как хранить в базе символ %? (Как загрузить классификатор единиц измерения ОКЕИ)
Как хранить в базе символ %? [сообщение #4517] |
Thu, 22 February 2024 07:56 |
668010
Сообщений: 5 Зарегистрирован: February 2024
|
Junior Member |
|
|
Здравствуйте.
Пытаюсь сохранить в базе классификаторы единиц измерения ОКЕИ и столкнулся с проблемой при следующем запросе:
select CLASSIFIER_DATA.CLASSIFIER_DATA_ID from CLASSIFIER_DATA where CLASSIFIER_DATA.CLASSIFIER_DATA_NAME like :CLASSIFIER_DATA_NAME
Проблема в том, что если CLASSIFIER_DATA_NAME, оно-же условное обозначение единицы измерения, это % или содержит знак %, то запрос работает некорректно.
Есть возможность использования escape символа, но никто не дает гарантии, что его не будет в том же обозначении. Надежный способ сделать перебор, но ради одного символа % это перебор.
Молчу про символ _, с ним абс, азс, амс вообще одно и тоже.
Поискал решение проблемы, но нашел только в Postgre: там можно отключить % и _, указав в качестве escape ''. В firebird это не работает.
Кто подскажет решение или хотя бы как отправить разработчику хотелку?
|
|
|
|
|
|
|
|
|
|
Re: Как хранить в базе символ %? [сообщение #4526 является ответом на сообщение #4525] |
Sun, 25 February 2024 08:42 |
668010
Сообщений: 5 Зарегистрирован: February 2024
|
Junior Member |
|
|
Для одаренных - полный текст:
create or alter procedure CLASSIFIER_LINK_DATA_ADD (
CLASSIFIER_TYPE_ID bigint,
CLASSIFIER_VIEW_ID bigint,
CLASSIFIER_CODE varchar(10) character set UTF8,
CLASSIFIER_DATA_NAME varchar(100) character set UTF8,
CLASSIFIER_NAME varchar(100) character set UTF8,
LANGUAGE_ID bigint,
USER_ID bigint)
as
declare variable CLASSIFIER_NAME_ID bigint;
declare variable CLASSIFIER_LINK_DATA_ID bigint;
declare variable CLASSIFIER_DATA_ID bigint;
declare variable CLASSIFIER_ID bigint;
begin
if (cast (:CLASSIFIER_CODE as bigint) is not null) then begin
CLASSIFIER_CODE=trim(upper(:CLASSIFIER_CODE));
/*проверяем код*/
select CLASSIFIERS.CLASSIFIER_ID from CLASSIFIERS where CLASSIFIERS.CLASSIFIER_CODE like :CLASSIFIER_CODE into :CLASSIFIER_ID;
if (:CLASSIFIER_ID is null) then begin
CLASSIFIER_ID=gen_id(GEN_CLASSIFIERS_ID,1);
insert into CLASSIFIERS(CLASSIFIER_ID,CLASSIFIER_CODE,CLASSIFIER_TYPE_ID ) values (:CLASSIFIER_ID,:CLASSIFIER_CODE,:CLASSIFIER_TYPE_ID);
CLASSIFIER_NAME_ID=gen_id(GEN_CLASSIFIER_NAMES_ID,1);
insert into CLASSIFIER_NAMES(CLASSIFIER_NAME_ID,CLASSIFIER_ID,LANGUAGE_I D,CLASSIFIER_NAME) values (:CLASSIFIER_NAME_ID,:CLASSIFIER_ID,:LANGUAGE_ID,:CLASSIFIER _NAME);
end
/*проверяем сокращение*/
CLASSIFIER_DATA_NAME=trim(upper(:CLASSIFIER_DATA_NAME));
if (:CLASSIFIER_DATA_NAME CONTAINING '%') then begin
select CLASSIFIER_DATA.CLASSIFIER_DATA_ID from CLASSIFIER_DATA where CLASSIFIER_DATA.CLASSIFIER_DATA_NAME like REPLACE(:CLASSIFIER_DATA_NAME,'%','\%') escape '\' into :CLASSIFIER_DATA_ID;
if (:CLASSIFIER_DATA_ID is null) then begin
CLASSIFIER_DATA_ID=gen_id(GEN_CLASSIFIER_DATA_ID,1);
insert into CLASSIFIER_DATA(CLASSIFIER_DATA_ID,CLASSIFIER_DATA_NAME) values (:CLASSIFIER_DATA_ID,:CLASSIFIER_DATA_NAME);
end
end else begin
select CLASSIFIER_DATA.CLASSIFIER_DATA_ID from CLASSIFIER_DATA where CLASSIFIER_DATA.CLASSIFIER_DATA_NAME like :CLASSIFIER_DATA_NAME into :CLASSIFIER_DATA_ID;
if (:CLASSIFIER_DATA_ID is null) then begin
CLASSIFIER_DATA_ID=gen_id(GEN_CLASSIFIER_DATA_ID,1);
insert into CLASSIFIER_DATA(CLASSIFIER_DATA_ID,CLASSIFIER_DATA_NAME) values (:CLASSIFIER_DATA_ID,:CLASSIFIER_DATA_NAME);
end
end
/*проверяем совпадение*/
select CLASSIFIER_LINK_DATA.CLASSIFIER_LINK_DATA_ID from CLASSIFIER_LINK_DATA where CLASSIFIER_LINK_DATA.CLASSIFIER_ID=:CLASSIFIER_ID and CLASSIFIER_LINK_DATA.CLASSIFIER_DATA_ID=:CLASSIFIER_DATA_ID and CLASSIFIER_LINK_DATA.CLASSIFIER_VIEW_ID=:CLASSIFIER_VIEW_ID into :CLASSIFIER_LINK_DATA_ID;
if (:CLASSIFIER_LINK_DATA_ID is null) then begin
CLASSIFIER_LINK_DATA_ID=gen_id(GEN_CLASSIFIER_LINK_DATA_ID,1 );
insert into CLASSIFIER_LINK_DATA(CLASSIFIER_LINK_DATA_ID,CLASSIFIER_ID,C LASSIFIER_VIEW_ID,CLASSIFIER_DATA_ID,USER_ID) values (:CLASSIFIER_LINK_DATA_ID,:CLASSIFIER_ID,:CLASSIFIER_VIEW_ID ,:CLASSIFIER_DATA_ID,:USER_ID);
end
end
end
|
|
|
Re: Как хранить в базе символ %? [сообщение #4528 является ответом на сообщение #4524] |
Sun, 25 February 2024 16:02 |
SD
Сообщений: 417 Зарегистрирован: August 2022
|
Senior Member |
|
|
668010 писал(а) Sun, 25 February 2024 06:33 create table t(v varchar(20));
insert into t values ('%');
commit;
select * from t where v like '%';
НУЖНО ЭТО а не abc. Читайте внимательно.!!!
Мозг не нужен, достаточно шустреньких лапок и примера выше. Не нужен abc - УБЕРИ abc
SQL> select * from t where v like '\%' escape '\';
V
====================
%
[Обновления: Sun, 25 February 2024 16:04] Известить модератора
|
|
|
|
|
|
|
|
Переход к форуму:
Текущее время: Sun Dec 22 14:41:18 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01027 секунд
|