SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Как хранить в базе символ %? (Как загрузить классификатор единиц измерения ОКЕИ)
Как хранить в базе символ %? [сообщение #4517] Thu, 22 February 2024 07:56 Переход к следующему сообщению
668010 в настоящее время не в онлайне  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: Как хранить в базе символ %? [сообщение #4518 является ответом на сообщение #4517] Thu, 22 February 2024 11:07 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 306
Зарегистрирован: August 2022
Senior Member
Escape символ прекрасно работает в отношении самого себя, а не только с % и _
Удваивай escape символ в шаблоне поиска там, где он должен использоваться сам по себе, а не как escape.

X like 'a\\b%' escape '\'
найдёт все значения X, начинающиеся на a\b

X like 'a\\b\%%' escape '\'
найдёт все значения X, начинающиеся на a\b%
Re: Как хранить в базе символ %? [сообщение #4519 является ответом на сообщение #4518] Fri, 23 February 2024 10:46 Переход к предыдущему сообщениюПереход к следующему сообщению
668010 в настоящее время не в онлайне  668010
Сообщений: 5
Зарегистрирован: February 2024
Junior Member
hvlad писал(а) Thu, 22 February 2024 11:07
Escape символ прекрасно работает в отношении самого себя, а не только с % и _
Удваивай escape символ в шаблоне поиска там, где он должен использоваться сам по себе, а не как escape.

X like 'a\\b%' escape '\'
найдёт все значения X, начинающиеся на a\b

X like 'a\\b\%%' escape '\'
найдёт все значения X, начинающиеся на a\b%
Мне кажется прежде чем что-то писать надо подумать.... К чему это все?
Что удваивать? Может проще Утраивать?

Без обид - написана белиберда.

Есть список обозначения классификаторов в базе данных, нужно проверить есть ли указанное обозначение в базе данных. Как назло это символ процента.

Re: Как хранить в базе символ %? [сообщение #4520 является ответом на сообщение #4519] Fri, 23 February 2024 11:00 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 306
Зарегистрирован: August 2022
Senior Member
Прежде чем писать, нужно прочитать. И понять.

Я показал, как искать % с помощью like.
Ты попробовал ?
Re: Как хранить в базе символ %? [сообщение #4522 является ответом на сообщение #4519] Fri, 23 February 2024 17:03 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 338
Зарегистрирован: August 2022
Senior Member
668010 писал(а) Fri, 23 February 2024 08:46

Мне кажется прежде чем что-то писать надо подумать.... К чему это все?
Что удваивать? Может проще Утраивать?
Думать - не наш путь. Мы от сохи, привыкли проверять руками:
SQL> create table t(v varchar(20));
SQL> insert into t values ('abc%def');
SQL> insert into t values ('abcdef');
SQL> commit;
SQL> select * from t where v like 'abc%';

V
====================
abc%def
abcdef

SQL> select * from t where v like 'abc\%' escape '\';
SQL> select * from t where v like 'abc\%def' escape '\';

V
====================
abc%def

SQL> select * from t where v like 'abc\%%' escape '\';

V
====================
abc%def

SQL> select * from t where v like 'abc%%';

V
====================
abc%def
abcdef
Re: Как хранить в базе символ %? [сообщение #4523 является ответом на сообщение #4519] Sat, 24 February 2024 20:52 Переход к предыдущему сообщениюПереход к следующему сообщению
kdv в настоящее время не в онлайне  kdv
Сообщений: 90
Зарегистрирован: June 2022
Member
оч. смешно, когда вылазят такие предъявы разработчику СУБД Firebird... Smile
Ну то есть, мы какой-то софт используем, но кто его написал, нам пофиг, да?

p.s. вы еще в лигу стандартов SQL письмо напишИте.
Re: Как хранить в базе символ %? [сообщение #4524 является ответом на сообщение #4523] Sun, 25 February 2024 08:33 Переход к предыдущему сообщениюПереход к следующему сообщению
668010 в настоящее время не в онлайне  668010
Сообщений: 5
Зарегистрирован: February 2024
Junior Member
create table t(v varchar(20));
insert into t values ('%');

commit;

select * from t where v like '%';

НУЖНО ЭТО а не abc. Читайте внимательно.!!!
Re: Как хранить в базе символ %? [сообщение #4525 является ответом на сообщение #4520] Sun, 25 February 2024 08:40 Переход к предыдущему сообщениюПереход к следующему сообщению
668010 в настоящее время не в онлайне  668010
Сообщений: 5
Зарегистрирован: February 2024
Junior Member
hvlad писал(а) Fri, 23 February 2024 11:00
Прежде чем писать, нужно прочитать. И понять.

Я показал, как искать % с помощью like.
Ты попробовал ?
конкретно select * from t where v like '%'  не видел. Искать abc мне не надо.
Re: Как хранить в базе символ %? [сообщение #4526 является ответом на сообщение #4525] Sun, 25 February 2024 08:42 Переход к предыдущему сообщениюПереход к следующему сообщению
668010 в настоящее время не в онлайне  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 в настоящее время не в онлайне  SD
Сообщений: 338
Зарегистрирован: 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]

Известить модератора

Re: Как хранить в базе символ %? [сообщение #4531 является ответом на сообщение #4528] Sun, 25 February 2024 17:36 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 295
Зарегистрирован: June 2022
Senior Member
Для начала ТС надо определится, а точно ли ему нужен like.
А то может STARTING WITH или CONTANING подойдут
Re: Как хранить в базе символ %? [сообщение #4534 является ответом на сообщение #4531] Sun, 25 February 2024 22:27 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время в онлайне  shavluk
Сообщений: 65
Зарегистрирован: June 2022
Географическое положение: Одеса
Member
А чем смысл использовать LIKE если не использовать "%" и '_'?
Re: Как хранить в базе символ %? [сообщение #4537 является ответом на сообщение #4534] Mon, 26 February 2024 04:38 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 108
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
Надо всего-лишь открыть документацию и почитать про LIKE

LIKE

Синтаксис:
<match value> [NOT] LIKE <pattern>
[ESCAPE <escape character>]

Трафаретные символы

В шаблоне, разрешается использование двух трафаретных символов:
• символ процента (%) заменяет последовательность любых символов (число символов в последовательности может быть от 0 и более) в проверяемом значении;
• символ подчёркивания (_), который можно применять вместо любого единичного символа в проверяемом значении.

Если проверяемое значение соответствует образцу с учётом трафаретных символов, то предикат истинен.

Использование управляющего символа в предложении ESCAPE

Если искомая строка содержит трафаретный символ, то следует задать управляющий символ в предложении ESCAPE. Этот управляющий символ должен использоваться в образце перед трафаретным символом, сообщая о том, что последний следует трактовать как обычный символ.
Re: Как хранить в базе символ %? [сообщение #4538 является ответом на сообщение #4526] Mon, 26 February 2024 08:10 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 94
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Member
668010 писал(а) Sun, 25 February 2024 13:42
Для одаренных
Когда у меня возникли схожие проблемы для (виндового) "for /f" - выбрал разделителем токенов ^A.
У вас, надеюсь, не совсем весь US-ASCII используется?
Re: Как хранить в базе символ %? [сообщение #4540 является ответом на сообщение #4538] Mon, 26 February 2024 13:25 Переход к предыдущему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 794
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
а я бы просто послал на#уй.
Предыдущая тема: Бесплатный IBExpert закончился?
Следующая тема: Конект как domain user
Переход к форуму:
  


Текущее время: Sun Apr 14 04:29:22 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01081 секунд