Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Konwersja funkcji z Oracle na PostgreSQL

Funkcja strpos(str, sub) w Postgresie jest odpowiednikiem instr(str, sub) w Oracle. Niestety funkcja nie ma trzeciego i czwartego parametru, więc wyrażenie w Postgresie musi być bardziej złożone.

Funkcja substr(str, n) daje podciąg str zaczynając od n pozycja.

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

Jako instr() to potężna funkcja, którą napisałem w plpgsql na własne potrzeby.

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 $$;

Niektóre kontrole (przykłady z Funkcje OLAP DML ):

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

Nie ma reverse() funkcja w Postgresie 8.2. Możesz użyć tego:

-- 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie udało się uzyskać/utworzyć połączenia z puli połączeń

  2. Zaktualizuj kolumnę przy użyciu losowych unikalnych wartości z innej tabeli

  3. Najlepsza praktyka Oracle raise_application_error numer błędu

  4. Jak wypełnić zbiór danych za pomocą C# z bazy danych Oracle

  5. Jak stworzyć użytkownika w Oracle SQL developer