【问题标题】:'stuff' and 'for xml path('')' from SQL Server in Postgresql'stuff' 和 'for xml path('')' 来自 Postgresql 中的 SQL Server
【发布时间】:2012-12-16 16:05:45
【问题描述】:

我正在将一些 SQL Server 2008R2 查询迁移到 Postgresql 9.0,但遇到了一些问题。 这是 SQL Server 查询:

stuff((select ', '+p.[NAME] as 'data()' 
from BPROVIDERS_PROVIDER p, BORDER_ARTICLEORDERPROVIDER aop 
where p.OID = aop.PROVIDER for xml path('')),1,1,'')) as pNAMES

阅读 SQL Server 文档我知道这会创建一个逗号分隔的列表。我认为我可以在 Postresql 中将 stuff 函数更改为 overlay 函数。我说的对吗?

第二个问题是 SQL Server 的for xml path 带有 ('') 作为参数。它返回分配给名为pNAMES 的属性的值,而不是创建行元素。那是对的吗?

Postgresql Query_to_xml() 函数与属性 tableforest = 'true' 是否相同?

谢谢。

【问题讨论】:

    标签: sql postgresql string-aggregation


    【解决方案1】:

    STUFF((SELECT DISTINCT ', ' + CONVERT(VARCHAR,L.ROLE_SUB_CAT_ID) FROM [PHS].[dbo].PHS_ADMIN_USER_ACCESS_DTL K, [PHS].[dbo].[PHS_ADMIN_USER_ROLE_SUB_CAT_MST] L WHERE L.ROLE_SUB_CAT_ID = K .ROLE_SUB_CAT_ID AND K.UMC_ID = A.UMC_ID AND K.CCR_ID = A.CCR_ID FOR XML PATH('')), 1, 1, '') AS ROLE_SUB_CAT_ID

    像这样将其转换为 postgresql:

    string_agg((SELECT distinct ', ' || cas​​t(L.ROLE_SUB_CAT_ID as VARCHAR) FROM PHS.dbo.PHS_ADMIN_USER_ACCESS_DTL K, PHS.dbo.PHS_ADMIN_USER_ROLE_SUB_CAT_MST L 其中 L.ROLE_SUB_CAT_ID = K.ROLE_SUB_CAT_ID 和 K.UMC_ID = A。 UMC_ID AND K.CCR_ID=A.CCR_ID ), 1, 1, '') AS ROLE_SUB_CAT_ID

    【讨论】:

      【解决方案2】:

      带有 XML PATH 的 STUFF()

      与记录 STUFF 相同的表

      SELECT distinct C.country, X.ProductList FROM     
      tbl_demo as C     
      CROSS APPLY    
      (    
      SELECT STUFF    
            (    
                (    
                    SELECT 
                          distinct 
                              ',' + P.product 
                          FROM 
                              tbl_demo AS P    
                          JOIN 
                              tbl_demo AS CP 
                          ON 
                              P.country = CP.country     
                          WHERE 
                              CP.sub_id = C.sub_id    
                          FOR XML PATH('')    
                )    
                    
            ,1,1,'') as ProductList    
      ) as X
      

      【讨论】:

        【解决方案3】:

        您可以改用string_agg

        SQL Fiddle

        PostgreSQL 9.1.6 架构设置

        create table T
        (
          Name varchar(10)
        );
        
        insert into T values('Kalle');
        insert into T values('Pelle');
        insert into T values('Urban');
        

        查询 1

        select string_agg(Name, ',') as Names
        from T
        

        Results

        |             NAMES |
        ---------------------
        | Kalle,Pelle,Urban |
        

        【讨论】:

        • 感谢您的回答,'for xml path' 和 'query_to_xml' 呢?
        • @user1891262 - 您的查询不需要它。 PostgreSQL 中的 string_agg 与 SQL Server 中的 for xml path 一样。
        猜你喜欢
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        相关资源
        最近更新 更多