| Начало » Использование СУБД » 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 Сообщений: 452
 Зарегистрирован: August 2022
 | Senior Member |  |  |  
	| 668010 писал(а) Sun, 25 February 2024 06:33  create table t(v varchar(20));Мозг не нужен, достаточно шустреньких лапок и примера выше. Не нужен abc - УБЕРИ abcinsert into t values ('%');
 
 commit;
 
 select * from t where v like '%';
 
 НУЖНО ЭТО а не abc. Читайте внимательно.!!!
 
 SQL> select * from t where v like '\%' escape '\';
V
====================
%[Обновления: Sun, 25 February 2024 16:04] Известить модератора |  
	|  |  |  
	|  |  
	|  |  
	|  |  
	|  |  
	|  | 
 
 
 Текущее время: Sat Nov 01 02:47:25 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.01518 секунд |