4

私は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

私が見つけたすべての例には、関数の本体に常に選択、削除、更新、挿入があります。

選択、削除、更新、挿入を含まない関数を定義することは実際に可能ですか?

PostgresSql 9.2 を使用しています。

4

2 に答える 2

3

構文エラーは、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;
于 2013-10-03T11:03:07.487 に答える
2

void を返さないでください。構文に問題があります。文字列を返す必要があり、次のようなステートメントが必要です。

RETURN LOWER(...)

また

RETURN SELECT LOWER(...)
于 2013-10-03T10:58:03.510 に答える