Я пытался создать функцию, чтобы получить значение, заменить определенный символ и вернуть его.
Данные о характеристиках таблиц
caracter remplazo
Ñ N
ñ n
á a
é e
Ê E
Функция
create function "informix".arreglar_cadenaAndSec(rt_nombre char(50))
Returning char(50)
Define fix_caracter char(3);
Define fix_remplazo char(3);
FOREACH SELECT caracter,remplazo
INTO fix_caracter,fix_remplazo
FROM caracteres
Let rt_nombre=replace(rt_nombre,fix_caracter,fix_remplazo);
END FOREACH
return rt_nombre;
End Function;
Вход
FÊLIX
Вывод
FÊLIX
Желаемый результат
FELIX
Попробуйте использовать функцию TRIM() для аргументов old_string и new_string функции REPLACE(), как в этом примере:
create table characters(character char(3), replchar char(3));
insert into characters values("A", "a");
insert into characters values("C", "c");
insert into characters values("E", "e");
create function replchar(s1 char(50))
returning char(50);
define cin char(3);
define crepl char(3);
foreach select character, replchar into cin, crepl
from characters
let s1 = replace(s1, trim(cin), trim(crepl));
end foreach
return s1;
end function;
execute function replchar("ABCDEF");
Это дает результат:
aBcDeF
Я не смог воспроизвести вашу проблему. Я использовал этот код, чтобы попытаться воспроизвести его:
select replace("platypus and wombat - archetypal critters", "y", "elephant") as answer from dual;
Это дает: platelephantpus and wombat - archetelephantpal critters
select replace("platypus aÑd wombat - archetypal critters", "Ñ", "**N**") as answer from dual;
Это дает: platypus a**N**d wombat - archetypal critters
Оба они просто проверяют функцию REPLACE
, в том числе на буквах с акцентом.
Затем, пробуя ваш сценарий:
create function "informix".arreglar_cadenaAndSec(rt_nombre char(50))
Returning char(50)
Define fix_caracter char(3);
Define fix_remplazo char(3);
FOREACH SELECT caracter,remplazo
INTO fix_caracter,fix_remplazo
FROM caracteres
Let rt_nombre=replace(rt_nombre,fix_caracter,fix_remplazo);
END FOREACH
return rt_nombre;
End Function;
create table caracteres(caracter varchar(5) not null, remplazo varchar(10) not null);
insert into caracteres values('Ñ', 'N');
insert into caracteres values('ñ', 'n');
insert into caracteres values('á', 'a');
insert into caracteres values('é', 'e');
insert into caracteres values('Ê', 'E');
execute function arregular_cadenaAndSec('Qua (Ñ N) (ñ n) (á a) (é e) (Ê E)');
Выход из этого:
Qua (N N) (n n) (a a) (e e) (E E)
Я думаю, это то, что вы хотели бы получить от данных записей в таблице caracteres
.
Я тестирую IDS 14.10.FC1DE на RHEL 7.4. Моя среда:
DBDATE=Y4MD-
DBEDIT=vim
INFORMIXCONCSMCFG=/work1/informix/jl-ibm-14.10.FC1/etc/concsm.njdc_ldev04_23
INFORMIXDIR=/work1/informix/jl-ibm-14.10.FC1
INFORMIXSERVER=njdc_ldev04_23
INFORMIXTERM=terminfo
LANG=en_US.UTF-8
LC_COLLATE=C
LD_LIBRARY_PATH=/lib64:/usr/lib64:/usr/gcc/v12.2.0/lib64:/usr/gcc/v12.2.0/lib:/lib:/usr/lib:/work1/informix/jl-ibm-14.10.FC1/lib:/work1/informix/jl-ibm-14.10.FC1/lib/esql:/work1/informix/jl-ibm-14.10.FC1/lib/cli
ONCONFIG=onconfig.njdc_ldev04_23
PATH=.:/work2/jleffler/bin:/u/jleffler/bin:/work1/informix/jl-ibm-14.10.FC1/bin:/atria_release/cmbin:/atria_release/cmbin/mergescripts:/atria_release/cm_dist/vobs/imitools/bin:/usr/atria/bin:/u/jleffler/aux/njdc-ldev04:/usr/perl/v5.34.0/bin:/usr/gcc/v12.2.0/bin:/usr/local/bin:/usr/bin:/usr/sbin:/opt/rational/clearcase/bin
SQLCMDLOG=/work2/jleffler/.sqlcmdlog
SQLEXEC=sqlrm
TERM=xterm-256color
TERMINFO=/u/jleffler/terminfo