【问题标题】:sql function without select/insert/delete/update没有选择/插入/删除/更新的sql函数
【发布时间】:2013-10-03 19:03:07
【问题描述】:

我对 sql 不是很有经验,这是我的(也许是愚蠢的)问题:

我有以下问题

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;

但运行它我得到错误

错误:»LOWER« SQL 状态的语法错误:42601 字符:88

我发现的所有示例在函数体中总是有一个选择、删除、更新、插入。

实际上可以定义一个没有select、delete、update、insert的函数吗?

我正在使用 PostgresSql 9.2。

【问题讨论】:

  • 我补充了雷米的回答:您应该将 lower() 函数应用于参数而不是结果。否则Ä 不会转换为ae

标签: sql postgresql


【解决方案1】:

语法错误是由于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;

【讨论】:

    【解决方案2】:

    不要返回无效。你有语法问题。它应该返回一个字符串,并有如下语句:

    RETURN LOWER(...)
    

    RETURN SELECT LOWER(...)
    

    【讨论】:

    • 函数也需要改成returns text而不是returns void
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多