`

PostgreSQL模仿Oracle的instr函数

阅读更多
PostgreSQL模仿Oracle的instr函数:
--
-- instr functions that mimic Oracle's counterpart
-- Syntax: instr(string1, string2, [n], [m]) where [] denotes optional parameters.
--
-- Searches string1 beginning at the nth character for the mth occurrence
-- of string2.  If n is negative, search backwards.  If m is not passed,
-- assume 1 (search starts at first character).
--

CREATE FUNCTION instr(varchar, varchar) RETURNS integer AS $$
DECLARE
    pos integer;
BEGIN
    pos:= instr($1, $2, 1);
    RETURN pos;
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;


CREATE FUNCTION instr(string varchar, string_to_search varchar, beg_index integer)
RETURNS integer AS $$
DECLARE
    pos integer NOT NULL DEFAULT 0;
    temp_str varchar;
    beg integer;
    length integer;
    ss_length integer;
BEGIN
    IF beg_index > 0 THEN
        temp_str := substring(string FROM beg_index);
        pos := position(string_to_search IN temp_str);

        IF pos = 0 THEN
            RETURN 0;
        ELSE
            RETURN pos + beg_index - 1;
        END IF;
    ELSE
        ss_length := char_length(string_to_search);
        length := char_length(string);
        beg := length + beg_index - ss_length + 2;

        WHILE beg > 0 LOOP
            temp_str := substring(string FROM beg FOR ss_length);
            pos := position(string_to_search IN temp_str);

            IF pos > 0 THEN
                RETURN beg;
            END IF;

            beg := beg - 1;
        END LOOP;

        RETURN 0;
    END IF;
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;


CREATE FUNCTION instr(string varchar, string_to_search varchar,
                      beg_index integer, occur_index integer)
RETURNS integer AS $$
DECLARE
    pos integer NOT NULL DEFAULT 0;
    occur_number integer NOT NULL DEFAULT 0;
    temp_str varchar;
    beg integer;
    i integer;
    length integer;
    ss_length integer;
BEGIN
    IF beg_index > 0 THEN
        beg := beg_index;
        temp_str := substring(string FROM beg_index);

        FOR i IN 1..occur_index LOOP
            pos := position(string_to_search IN temp_str);

            IF i = 1 THEN
                beg := beg + pos - 1;
            ELSE
                beg := beg + pos;
            END IF;

            temp_str := substring(string FROM beg + 1);
        END LOOP;

        IF pos = 0 THEN
            RETURN 0;
        ELSE
            RETURN beg;
        END IF;
    ELSE
        ss_length := char_length(string_to_search);
        length := char_length(string);
        beg := length + beg_index - ss_length + 2;

        WHILE beg > 0 LOOP
            temp_str := substring(string FROM beg FOR ss_length);
            pos := position(string_to_search IN temp_str);

            IF pos > 0 THEN
                occur_number := occur_number + 1;

                IF occur_number = occur_index THEN
                    RETURN beg;
                END IF;
            END IF;

            beg := beg - 1;
        END LOOP;

        RETURN 0;
    END IF;
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;



参考网站:

http://www.dbaref.com/postgresql-database/instrfunctioninpostgresql
http://www.postgresql.org/docs/9.1/static/plpgsql-porting.html
http://www.postgresql.org/docs/7.4/static/plpgsql-porting.html#PLPGSQL-PORTING-APPENDIX
分享到:
评论

相关推荐

    postgresql 兼容 oracle 函数

    2. **字符串函数**:诸如 INITCAP、SUBSTR、INSTR等在PostgreSQL中也有相应的实现,方便进行字符串操作。 3. **数学和转换函数**:如ROUND、TRUNC、TO_CHAR、TO_DATE等,这些在数据转换和计算中十分常用。 4. **...

    oracle转成postgre时,oracle中函数的处理工具(orafce)

    本话题主要关注的是如何在Oracle数据库向PostgreSQL迁移过程中处理Oracle特有的函数,这里我们提到了一个名为"orafce"的工具。 orafce,全称为“Oracle Functions for PostgreSQL”,是一个开源项目,它为...

    pg与oracle语法差异

    - **INSTR函数**: - **Oracle**: 使用 `instr('str1','str2')` 查找子字符串的位置。 - **PostgreSQL**: 使用 `strpos('str1','str2')` 实现相同功能。 - **NVL函数**: - **Oracle**: 使用 `NVL` 函数来处理 `...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    PostgreSQL 号称“世界上最先进的开源数据库“,可以运行在多种平台下,是tb级数据库,而且性能也很好 中大型企业 oracle 甲骨文 获得最高认证级别的ISO标准安全认证,性能最高, 保持开放平台下的TPC-D和TPC-C的...

    Actividad-3 --- Ejercicios-SQL-Consultas-con-busqueda-de-correspondencia-de-patrones-

    5. **INSTR函数**:某些数据库系统提供了INSTR函数,它可以在字符串中查找子串的位置,这对于模式查找也很有用。 6. **正则表达式函数**:如`REGEXP`或`RLIKE`,这些函数在某些数据库系统中用于执行正则表达式匹配...

    数据库脚本sql

    - **INSTR**:在某些数据库系统中,如Oracle,可以使用 `INSTR` 函数来查找子串位置。 5. **字符串转换** - **UPPER** 和 **LOWER**:将字符串转换为大写或小写。 - **TRIM**:去除字符串首尾的空格,有的系统还...

    SQL21自学通.pdf

    - **Oracle SQL Developer**:Oracle公司的免费工具,用于管理Oracle数据库。 #### 三、SQL在编程中的应用 - **SQL与编程语言集成**:现代编程语言通常提供了与SQL集成的功能,如Python中的`psycopg2`库用于连接...

    SQL21自学通

    - Oracle SQL Developer - Microsoft SQL Server Management Studio - MySQL Workbench - PostgreSQL pgAdmin - SQLiteStudio - **SQL在编程中的应用:** - SQL常用于应用程序中进行数据的检索、更新等操作。...

    sql语句查询使用

    - **字符函数**:`CHR`、`CONCAT`、`INITCAP`、`LOWER`、`UPPER`、`LPAD`、`RPAD`、`LTRIM`、`RTRIM`、`REPLACE`、`SUBSTR`、`TRANSLATE`、`INSTR`、`LENGTH`等,用于字符串操作。 - **转换函数**:`TO_CHAR`、`TO_...

    02_sql21天学习

    - Oracle SQL Developer - MySQL Workbench - SQL Server Management Studio - pgAdmin (PostgreSQL) #### 第二天:查询——SELECT语句的使用 - **目标**:掌握SELECT语句的基本语法及其功能。 - **背景**:...

    零基础学SQL

    - **pgAdmin**:PostgreSQL的一个开源管理工具,功能强大且用户友好。 #### SQL在编程中的应用 - **应用场景**: - **Web开发**:通过服务器端脚本语言(如PHP、Python、Java等)与数据库交互。 - **桌面应用...

    SQL自学简明教程

    - Oracle SQL Developer:免费的图形化工具,支持多种数据库。 - MySQL Workbench:MySQL官方提供的集成开发环境。 - Microsoft SQL Server Management Studio:适用于SQL Server的强大工具。 - pgAdmin:...

    21天精通SQL教程

    - Oracle SQL Developer - MySQL Workbench - Microsoft SQL Server Management Studio (SSMS) - PostgreSQL’s pgAdmin - SQLiteStudio - **SQL在编程中的应用**:SQL常被用于网页应用程序、数据分析等领域。 ...

Global site tag (gtag.js) - Google Analytics