sql >> データベース >  >> RDS >> Oracle

関数をOracleからPostgreSQLに変換する

    関数strpos(str, sub) Postgresではinstr(str, sub)と同等です Oracleで。残念ながら、この関数には3番目と4番目のパラメーターがないため、Postgresの式はもっと複雑にする必要があります。

    関数substr(str, n) strの部分文字列を提供します nから開始 位置。

    instr(str, ch, instr(str, sub), 1);                               --oracle
    strpos(substr(str, strpos(str, sub)), ch) + strpos(str, sub) - 1; --postgres
    

    instr()として 自分のニーズに合わせてplpgsqlで作成した強力な関数です。

    create or replace function instr(str text, sub text, startpos int = 1, occurrence int = 1)
    returns int language plpgsql immutable
    as $$
    declare 
        tail text;
        shift int;
        pos int;
        i int;
    begin
        shift:= 0;
        if startpos = 0 or occurrence <= 0 then
            return 0;
        end if;
        if startpos < 0 then
            str:= reverse(str);
            sub:= reverse(sub);
            pos:= -startpos;
        else
            pos:= startpos;
        end if;
        for i in 1..occurrence loop
            shift:= shift+ pos;
            tail:= substr(str, shift);
            pos:= strpos(tail, sub);
            if pos = 0 then
                return 0;
            end if;
        end loop;
        if startpos > 0 then
            return pos+ shift- 1;
        else
            return length(str)- length(sub)- pos- shift+ 3;
        end if;
    end $$;
    

    いくつかのチェック(OLAPDML関数の例> ):

    select instr('Corporate Floor', 'or', 3, 2);  -- gives 14
    select instr('Corporate Floor', 'or', -3, 2); -- gives 2
    

    reverse()はありません Postgres8.2の機能。これを使用できます:

    -- only for Postgres 8.4 or earlier!
    create or replace function reverse(str text)
    returns text language plpgsql immutable
    as $$
    declare
        i int;
        res text = '';
    begin
        for i in 1..length(str) loop
            res:= substr(str, i, 1) || res;
        end loop;
        return res;
    end $$;
    


    1. 文字列に特殊文字が含まれているかどうかを検出するにはどうすればよいですか?

    2. 選択と更新の間の競合状態

    3. SQLServerの文字列またはバイナリデータは切り捨てられます

    4. PostgreSQLは、照会された日付に正確または最も近い日付を返します