sql >> Databáze >  >> RDS >> Oracle

ORACLE SQL LISTAGG nevrací očekávaný výsledek

Zdá se, že to souvisí s chybou 19461687 a touto předchozí otázkou . Pokud vypíšete agregovanou hodnotu z vašeho dotazu v 11gR2 nebo 12cR1, uvidíte:

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

V SQL*Plus a SQL Developer se skutečná hodnota zobrazí jako:

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

a nemůžete zkopírovat hodnotu z SQL Developer. (V 12cR2 se nuly již ve výpisu neobjevují, hodnota se zobrazuje bez mezer a můžete ji zkopírovat, takže se zdá, že chyba byla opravena.)

Zdá se, že tyto nulové bajty způsobují, že Toad vůbec nezobrazuje hodnotu, pravděpodobně proto, že vidí první nulový bajt a zachází s ním jako s ukončovacím řetězcem (nebo tak jako tak).

Zdá se, že SQL Fiddle si s tím poradí, ale zdá se, že s tím má problém i db<>fiddle, a pokud je tento dotaz přítomen, nevrací nic pro celé housle.

Sloupec tabulky můžete předefinovat na varchar2 místo nvarchar2 , ale předpokládám, že z nějakého důvodu je to tento datový typ, takže to pravděpodobně není praktické.

Místo toho byste to mohli přenést jako součást dotazu:

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

Nebo se podívejte, zda oprava chyby 19461687 problém nevyřeší.



  1. Jak používat příkaz Alter Table v SQL?

  2. Triky pro zlepšení průběžného monitorování databáze

  3. Optimalizace pomalého dotazu ORDER BY RAND().

  4. Vyhledávání PHP/Mysql – rozlišují se malá a velká písmena