在postgresql中指定索引之后是否有任何函数可用于查找字符串位置

时间:2016-09-15 06:35:47

标签: postgresql

Postgres提供的功能:

strpos(string, substring)

例如:

strpos('my name is database', 'm')

返回:1

我的要求是返回指定索引后的子字符串的位置:

strpos(string, substring, 5)

例如:

strpos('my name is database', 'm', 1)

应该返回:6

2 个答案:

答案 0 :(得分:0)

STRPOS只接受两个参数。但是你可以将一个调用链接到子串并轻松实现你的目标。

SELECT STRPOS(SUBSTRING('my name is database',2), 'm')

请注意,postgresql字符串从1开始而不是0,因此您必须在上面的查询中放置2而不是1。当然结果是相对于新字符串'y name is database'所以你必须在结果中加1。

答案 1 :(得分:0)

如果有人正在寻找合适的功能

CREATE OR REPLACE FUNCTION STRPOSWPOS (p_String VARCHAR, p_searchString VARCHAR, p_startIndex INTEGER DEFAULT 0)
RETURNS INT
AS
$BODY$
DECLARE
    v_Return INT;
BEGIN
    p_String:=LOWER(p_String);
    p_searchString:=LOWER(p_searchString);
    v_return:= 
        CASE WHEN STRPOS(SUBSTRING(p_String, p_startIndex), p_searchString) > 0 AND p_startIndex = 0 THEN
                STRPOS(SUBSTRING(p_String, p_startIndex), p_searchString)
             WHEN STRPOS(SUBSTRING(p_String, p_startIndex), p_searchString) > 0 AND p_startIndex > 0 THEN
                STRPOS(SUBSTRING(p_String, p_startIndex), p_searchString) + p_startIndex - 1
             ELSE 0
        END;

    RETURN v_Return;
END;
$BODY$
LANGUAGE  plpgsql;