Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Chuyển đổi chức năng từ Oracle sang PostgreSQL

Hàm strpos(str, sub) trong Postgres tương đương với instr(str, sub) trong Oracle. Thật không may, hàm không có tham số thứ ba và thứ tư, vì vậy biểu thức trong Postgres phải phức tạp hơn.

Hàm substr(str, n) đưa ra một chuỗi con của str bắt đầu từ n vị trí.

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

Như instr() là một chức năng mạnh mẽ mà tôi đã viết nó trong plpgsql cho nhu cầu của riêng tôi.

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

Một số kiểm tra (Ví dụ từ Chức năng OLAP DML ):

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

Không có reverse() chức năng trong Postgres 8.2. Bạn có thể sử dụng cái này:

-- 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. Biểu thức chính quy cho REGEXP_SUBSTR trong Oracle

  2. Ngoại lệ triển khai weblogic:PaddingException:Không thể thực hiện việc bỏ đệm:byte đệm không hợp lệ

  3. Triển khai cx_Oracle trên các phiên bản khác nhau của Oracle Client

  4. Câu lệnh select oracle sql siêu lập trình

  5. Ora 12154 lỗi