Postgres子串错误

时间:2015-05-06 15:14:15

标签: postgresql view substring strpos

创建从网站http://pratchev.blogspot.com/2007/02/passing-variable-to-in-list.html的代码转换的视图时收到错误。 ERROR: function pg_catalog.substring(text,bigint,integer) does not exist;#7。感谢您的帮助。

代码:

WITH recursive Hierarchy(ChildId, SubRepInitials, ParentId, Parents, steps)
AS
(
    SELECT salesforceid, salesforceinitials, parentid, CAST('' AS TEXT), 0 as steps
        FROM tblbulksalesforce AS FirstGeneration
        WHERE parentid IS NULL AND salesforceinitials IS NOT NULL
    UNION ALL
    SELECT NextGeneration.salesforceid, NextGeneration.salesforceinitials, Parent.ChildId,
    CAST(CASE WHEN Parent.Parents = ''
        THEN(CAST(NextGeneration.parentid AS TEXT) || ',')
        ELSE(Parent.Parents || CAST(NextGeneration.parentid AS TEXT) || ',')
    END AS TEXT), Parent.steps +1 as steps
        FROM tblbulksalesforce AS NextGeneration
        INNER JOIN Hierarchy AS Parent ON NextGeneration.parentid = Parent.ChildId 
        WHERE NextGeneration.salesforceinitials IS NOT NULL   
)
    SELECT ISNULL(h.ParentId,h.ChildId) AS ParentId, h.ChildId
        , h.SubRepInitials, h.Parents, steps
        ,Generation0.salesforceinitials AS RepInitials
        ,parent.salesforceinitials AS RepInitialsParent
    FROM Hierarchy AS h
    LEFT JOIN tblbulksalesforce AS parent ON parent.RecordID = h.ParentId
    LEFT JOIN tblbulksalesforce AS Generation0 ON Generation0.RecordID IN (
             (SELECT SUBSTRING(string, 2, strpos(',', string, 2) - 2)
                FROM (SELECT SUBSTRING(list, n, character_length(list))
                        FROM (SELECT ',' || h.Parents || ',') AS L(list),
                        (SELECT ROW_NUMBER() OVER (ORDER BY parentid)
                            FROM Hierarchy) AS Nums(n)
                            WHERE n <=  character_length(list)) AS D(string) 
                        WHERE character_length(string) > 1 AND SUBSTRING(string, 1, 1) = ',')
    ) OR Generation0.RecordID = h.ChildId;

1 个答案:

答案 0 :(得分:0)

有关如何使用strpos()substr()的信息,请参阅Postgres docs。请注意,substring()是一个完全不同的函数,其参数的格式不同。

试试这个:

WITH recursive Hierarchy(ChildId, SubRepInitials, ParentId, Parents, steps)
AS
(
    SELECT salesforceid, salesforceinitials, parentid, CAST('' AS TEXT),     0 as steps
      FROM tblbulksalesforce AS FirstGeneration
      WHERE parentid IS NULL AND salesforceinitials IS NOT NULL
    UNION ALL
    SELECT NextGeneration.salesforceid, NextGeneration.salesforceinitials, Parent.ChildId,
    CAST(CASE WHEN Parent.Parents = ''
      THEN(CAST(NextGeneration.parentid AS TEXT) || ',')
      ELSE(Parent.Parents || CAST(NextGeneration.parentid AS TEXT) || ',')
    END AS TEXT), Parent.steps +1 as steps
      FROM tblbulksalesforce AS NextGeneration
      INNER JOIN Hierarchy AS Parent ON NextGeneration.parentid = Parent.ChildId 
      WHERE NextGeneration.salesforceinitials IS NOT NULL   
)
SELECT ISNULL(h.ParentId,h.ChildId) AS ParentId, h.ChildId
    , h.SubRepInitials, h.Parents, steps
    ,Generation0.salesforceinitials AS RepInitials
    ,parent.salesforceinitials AS RepInitialsParent
FROM Hierarchy AS h
LEFT JOIN tblbulksalesforce AS parent ON parent.RecordID = h.ParentId
LEFT JOIN tblbulksalesforce AS Generation0 ON Generation0.RecordID IN (
         (SELECT SUBSTR(string, 2, strpos(',', string) - 2) -- you had a 2 sitting in strpos(',', string, 2) before.  I'm not sure what you were trying to do with that. 
            FROM (SELECT SUBSTR(list, n, character_length(list))
                    FROM (SELECT ',' || h.Parents || ',') AS L(list),
                    (SELECT ROW_NUMBER() OVER (ORDER BY parentid)
                        FROM Hierarchy) AS Nums(n)
                        WHERE n <=  character_length(list)) AS D(string) 
                    WHERE character_length(string) > 1 AND SUBSTR(string, 1, 1) = ',')
) OR Generation0.RecordID = h.ChildId;