无选择/插入/删除/更新的sql函数
我对sql不是很有经验,这是我(可能是愚蠢的)问题: 我有以下疑问无选择/插入/删除/更新的sql函数,sql,postgresql,Sql,Postgresql,我对sql不是很有经验,这是我(可能是愚蠢的)问题: 我有以下疑问 select * from myTable where lower(replace(lastname, 'ü', 'ue')) = lower(replace(someStr, 'ü', 'ue')) 有没有可能更换新的 lower(replace(lastname, 'ü', 'ue')) = lower(replace(someStr, 'ü','ue')) 有功能吗 大概是这样的: select * from idma
select *
from myTable
where lower(replace(lastname, 'ü', 'ue')) = lower(replace(someStr, 'ü', 'ue'))
有没有可能更换新的
lower(replace(lastname, 'ü', 'ue')) = lower(replace(someStr, 'ü','ue'))
有功能吗
大概是这样的:
select *
from idmanlight.nethz_user
where myFunction(lastname) = myFunction(someStr)
我试图以这种方式定义函数:
CREATE FUNCTION myFunction(IN str character varying) RETURNS void AS $$
LOWER(replace(replace(replace((str, 'ü', 'ue'), 'ä', 'ae'), 'ö', 'oe'));
$$ LANGUAGE sql;
但是运行它我得到了错误
错误:语法错误由»较低«SQL状态:42601字符:88
我发现的所有示例在函数体中都有一个select、delete、update和insert
实际上可以定义一个没有选择、删除、更新和插入的函数
我正在使用Postgressql9.2。不要返回void。你有语法问题。它应该返回一个字符串,并具有如下语句:
RETURN LOWER(...)
或
语法错误是由于sql语法和不正确的返回值造成的:
CREATE FUNCTION myFunction(str text) RETURNS text AS $$
SELECT LOWER(replace(replace(replace((str, 'ü', 'ue'), 'ä', 'ae'), 'ö', 'oe'));
$$ IMMUTABLE STRICT LANGUAGE sql;
其他更完整的功能:
CREATE OR REPLACE FUNCTION translit(text)
RETURNS text
AS $$
DECLARE
_str text := $1;
_find constant text := 'ÀÁÂÃÄÅĀĄĂÆÈÉÊËĒĘĚĔĖÐÌÍÎÏĪĨĬĮİIJÒÓÔÕÖØŌŐŎŒÙÚÛÜŪŮŰŬŨŲÝŶŸ' ||
'àáâãäåāąăæèéêëēęěĕėðìíîïīĩĭįıijòóôõöøōőŏœùúûüūůűŭũųýÿŷ' ||
'ÇĆČĈĊĎĐƑĜĞĠĢĤĦĴĶŁĽĹĻĿÑŃŇŅŊŔŘŖŚŠŞŜȘſŤŢŦȚÞŴŹŽŻ' ||
'çćčĉċďđƒĝğġģĥħĵĸķłľĺļŀñńňņʼnŋŕřŗśšşŝșßťţŧțþŵžżź';
_repl constant text := 'AAAAAAAAAAEEEEEEEEEEIIIIIIIIIIOOOOOOOOOOUUUUUUUUUUYYY' ||
'aaaaaaaaaaeeeeeeeeeeiiiiiiiiiioooooooooouuuuuuuuuuyyy' ||
'CCCCCDDFGGGGHHJKLLLLLNNNNNRRRSSSSSSTTTTTWZZZ' ||
'cccccddfgggghhjkklllllnnnnnnrrrsssssstttttwzzz';
BEGIN
-- Bail if the string is empty.
IF _str = ''
THEN
RETURN _str;
END IF;
-- Common expansions.
_str := replace(_str, 'ſ', 'SS');
_str := replace(_str, 'ß', 'ss');
_str := replace(_str, 'Å', 'AA');
_str := replace(_str, 'å', 'aa');
_str := replace(_str, 'IJ', 'IJ');
_str := replace(_str, 'ij', 'ij');
_str := regexp_replace(_str, '([ÄÆÖŒÜ])', E'\\1E', 'g');
_str := regexp_replace(_str, '([äæöœü])', E'\\1e', 'g');
-- Translate what's left.
_str := translate(_str, _find, _repl);
RETURN _str;
END;
$$ IMMUTABLE STRICT LANGUAGE plpgsql COST 1;
该函数还需要更改为
返回文本
,而不是返回void
I。除了Remi的答案之外,您应该将lower()
函数应用于参数,而不是结果。否则,Ä
将不会转换为ae
CREATE OR REPLACE FUNCTION translit(text)
RETURNS text
AS $$
DECLARE
_str text := $1;
_find constant text := 'ÀÁÂÃÄÅĀĄĂÆÈÉÊËĒĘĚĔĖÐÌÍÎÏĪĨĬĮİIJÒÓÔÕÖØŌŐŎŒÙÚÛÜŪŮŰŬŨŲÝŶŸ' ||
'àáâãäåāąăæèéêëēęěĕėðìíîïīĩĭįıijòóôõöøōőŏœùúûüūůűŭũųýÿŷ' ||
'ÇĆČĈĊĎĐƑĜĞĠĢĤĦĴĶŁĽĹĻĿÑŃŇŅŊŔŘŖŚŠŞŜȘſŤŢŦȚÞŴŹŽŻ' ||
'çćčĉċďđƒĝğġģĥħĵĸķłľĺļŀñńňņʼnŋŕřŗśšşŝșßťţŧțþŵžżź';
_repl constant text := 'AAAAAAAAAAEEEEEEEEEEIIIIIIIIIIOOOOOOOOOOUUUUUUUUUUYYY' ||
'aaaaaaaaaaeeeeeeeeeeiiiiiiiiiioooooooooouuuuuuuuuuyyy' ||
'CCCCCDDFGGGGHHJKLLLLLNNNNNRRRSSSSSSTTTTTWZZZ' ||
'cccccddfgggghhjkklllllnnnnnnrrrsssssstttttwzzz';
BEGIN
-- Bail if the string is empty.
IF _str = ''
THEN
RETURN _str;
END IF;
-- Common expansions.
_str := replace(_str, 'ſ', 'SS');
_str := replace(_str, 'ß', 'ss');
_str := replace(_str, 'Å', 'AA');
_str := replace(_str, 'å', 'aa');
_str := replace(_str, 'IJ', 'IJ');
_str := replace(_str, 'ij', 'ij');
_str := regexp_replace(_str, '([ÄÆÖŒÜ])', E'\\1E', 'g');
_str := regexp_replace(_str, '([äæöœü])', E'\\1e', 'g');
-- Translate what's left.
_str := translate(_str, _find, _repl);
RETURN _str;
END;
$$ IMMUTABLE STRICT LANGUAGE plpgsql COST 1;