Начало » Использование СУБД » 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)); 
 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] Известить модератора  
 |  
	| 
		
	 | 
 
 
 |  
	| 
		
 |  
	| 
		
 |  
	| 
		
 |  
	| 
		
 |  
	| 
		
 |   
Переход к форуму:
 
 Текущее время: Tue Nov 04 06:13:13 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.00987 секунд 
 |