sql >> Databasteknik >  >> RDS >> Oracle

ORACLE SQL LISTAGG returnerar inte förväntat resultat

Detta verkar vara relaterat till bugg 19461687 och denna tidigare fråga . Om du dumpar det aggregerade värdet från din fråga i 11gR2 eller 12cR1 ser du:

LISTAGG_OUTPUT
--------------------------------------------------------------------------------------------------
Typ=1 Len=25 CharacterSet=AL32UTF8: 0,41,0,52,0,34,0,30,0,30,0,31,2c,0,41,0,52,0,34,0,30,0,30,0,32

I SQL*Plus och SQL Developer visas det faktiska värdet som:

LISTAGG_OUTPUT
----------------------------------------
 A R 4 0 0 1, A R 4 0 0 2

och du kan inte kopiera värdet från SQL Developer. (I 12cR2 visas inte längre nollorna i dumpen, värdet visas utan mellanrum och du kan kopiera det, så felet verkar ha åtgärdats.)

Dessa nollbyte verkar få Toad att inte visa värdet alls, förmodligen för att den ser den första nollbyten och behandlar den som en strängterminator (eller något i den stilen i alla fall).

SQL Fiddle verkar klara av detta, men db<>fiddle verkar också ha problem med det och returnerar ingenting för hela fiolen när den frågan finns.

Du kan omdefiniera din tabellkolumn som varchar2 istället för nvarchar2 , men jag antar att det är den datatypen av en anledning, så det är förmodligen inte praktiskt.

Så du kan casta det som en del av frågan istället:

SELECT LISTAGG(CAST(MOD_CODE AS VARCHAR2(12)),',')
  WITHIN GROUP (ORDER BY MOD_CODE) LISTAGG_OUTPUT
FROM XOTEST_A
WHERE MOD_CODE IN ('AR4001','AR4002');

LISTAGG_OUTPUT
----------------------------------------
AR4001,AR4002

Eller se om patchen för bugg 19461687 löser problemet åt dig.



  1. Openshift MySQL-kommunikationslänkfel

  2. SQL-kommando baserat på PHP strstr eller LIKE

  3. Använda `rand()` med `having`

  4. Hur man väljer antalet värden grupperade efter intervall