«Материал» и «для пути XML (» «)» из SQL Server в Postgresql

Обновить

December 2018

Просмотры

14.5k раз

5

Я перенос некоторого 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 Я понимаю , что это создает разделенный запятыми список. Я думаю , что я могу изменить stuffфункцию , чтобы overlayфункционировать в Postresql. Я прав?

Вторая проблема возникает с SQL сервера for xml pathс ( «») в качестве параметра. Она возвращает значение , присвоенное атрибуту называется pNAMESвместо создания элементов строк. Это верно?

Есть ли Postgresql Query_to_xml()функция с атрибутом tableforest = 'true'делать то же самое?

Спасибо.

2 ответы

2

You can replace it by String_agg for example SQL Server stored procedure:

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

Convert it to postgresql like this:

string_agg((SELECT distinct ', ' ||  cast(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
          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
          ), 1, 1, '') AS ROLE_SUB_CAT_ID
20

You can use string_agg instead.

SQL Fiddle

PostgreSQL 9.1.6 Schema Setup:

create table T
(
  Name varchar(10)
);

insert into T values('Kalle');
insert into T values('Pelle');
insert into T values('Urban');

Query 1:

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

Results:

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