Poniżej znajduje się skrypt Oracle, który muszę wykonać na serwerze SQL.

SELECT 
records.pr_id,
SUBSTR (REPLACE (REPLACE (XMLAGG (XMLELEMENT ("x", prad4.selection_value)
ORDER BY prad4.selection_value),'</x>'),'<x>',' ; '),4)  as teva_role
FROM records

Dzięki za pomoc,

Barry

-1
Barry Einhorn 16 grudzień 2019, 17:57
2
Wyjaśnij, co chcesz, aby kod robił. Pomogłyby w tym przykładowe dane i pożądane wyniki.
 – 
Gordon Linoff
16 grudzień 2019, 18:02

2 odpowiedzi

Od lat programuję w SQL w kilku środowiskach i jest to w około 75% to samo. Tak więc instrukcja SQL powinna działać tak, jak jest, jednak funkcje (REPLACE, SUBSTR) będą tym, czego potrzebujesz, aby zbadać i zmienić.

Ponadto otrzymujesz kolumny z prad4 bez uwzględniania go w instrukcji FROM, co jest problemem.

I wreszcie, twoje nawiasy nie są zbalansowane, co, jak sądzę, byłoby problemem również w Oracle.

0
user12537110user12537110 16 grudzień 2019, 18:13
Odrzuciłem to, ponieważ nie odpowiada na pytanie i powinien być komentarzem zamiast odpowiedzi.
 – 
Luis Cazares
16 grudzień 2019, 18:42

Jest to w zasadzie łączenie zestawu ciągów z ogranicznikiem. Typowym sposobem na to jest użycie FOR XML PATH(''), które wydaje się być odpowiednikiem kombinacji XMLELEMENT() w Oracle, ale z inną składnią. Możesz także użyć funkcji XML, aby zapobiec zmianie niektórych znaków niedozwolonych w XML. STUFF zajmuje się SUBSTR() częścią Twojego kodu. Bardziej szczegółowe wyjaśnienie można znaleźć w tym artykule na Tworzenie listy rozdzielanej przecinkami.

Kod powinien wyglądać podobnie do tego:

SELECT  records.pr_id,
        STUFF(( SELECT ' ; ' + prad4.selection_value
                FROM prad4
                WHERE prad4.pr_id = records.pr_id
                ORDER BY prad4.selection_value
                FOR XML PATH(''), TYPE).value('./text()[1]', 'varchar(max)'), 1, 3, '')
FROM records;

Oczywiście dzięki ulepszeniom SQL Server 2017 kod można uprościć do czegoś takiego:

SELECT  records.pr_id,
        STRING_AGG( selection_value, ' ; ') WITHIN GROUP (ORDER BY selection_value ASC) 
FROM records;
0
Luis Cazares 16 grudzień 2019, 18:40