2016-06-08 7 views
5

die Verwendung eines char-Cast in einer Gruppe-by-Klausel Ergebnisse etwas Unerwartetes:Oracle SQL - Gruppe von char werfen

select cast(col as char(2)) from (
    select 'Abc' as col from dual 
    union all 
    select 'Abc' as col from dual 
) group by cast(col as char(10)); 

Das Ergebnis ist 'Abc ' (10 Zeichen lang). Intuitiv , würde ich Oracle erwartet hat eine der folgenden zurückzukehren:

  • eine Fehlermeldung: ‚keine Gruppe-by-Expression‘, wie die Gruppe-BY-Klausel ist eine andere als die Auswahl Klausel
  • Ein Ergebnis der Länge 2 'Ab'.

Ersetzen cast(col as char(2)) mit cast(col as char(3)) kehrt Oracle einen Fehler 'keine Gruppe-by Ausdruck'. Dies ist wiederum ein sehr merkwürdiges Verhalten.

Wie kann das erklärt werden? Was ist der Grund dafür?

Ich benutze Oracle SQL 11g.

+0

Ich habe gerade auf 11g getestet und es produziert die gleichen Ergebnisse für die Werte 1-11, mit Ausnahme von 3. Sehr seltsam in der Tat. Für mich scheint das ein Fehler zu sein. Die Rückkehr sollte "Ab" sein. Der erwartete Wert wird zurückgegeben, wenn Sie eine Aggregationsfunktion verwenden. –

+0

Identisch mit Oracle 12 – sstan

+0

Warum verwenden Sie in einer Abfrage group by, die keine Aggregationsfunktion verwenden? – scaisEdge

Antwort

2

Wie oben erwähnt, denke ich, dass ein Missverständnis vor sich geht. oO

Ich kann nicht erklären, warum es dies tut, aber hier ist das Muster für die Art der Abfrage Sie haben:

Wenn Sie es ein bisschen wie folgt verallgemeinern, wobei [A] und [B] ganze Zahlen sind und [STRING] ist, was Text Sie wollen:

select cast(col as char([A])) from (
    select '[STRING]' as col from dual 
    union all 
    select '[STRING]' as col from dual 
) group by cast(col as char([B])); 

es sieht aus wie dies nicht gelingt immer, wenn eine der beiden Bedingungen unter wahr ist (es andere sein kann):

  1. (LÄNGE ([ STRING]) < [B] ODER L Änge ([string]> [B]) und [A] = Länge ([String])
  2. (LENGTH ([String]) = [B] und [A] <> LENGTH ([String]))

Andernfalls wird eine Zeile zurückgegeben.

Aber wenn Sie Ihr Beispiel nehmen, der ausgeführt wird und verwenden Sie es in einer CREATE TABLE-Anweisung, es wird scheitern, da es die Spaltenbreite richtet die 2 zu sein und kann die 3 Zeichenkette nicht passen kommen.

zum Kuriosität hinzuzufügen, wenn Sie etwas am Anfang und das Ende der Zeichenfolge wie folgt anhängen: diese

select '\*'||cast(col as char([A]))||'\*' from (
    select '[STRING]' as col from dual 
    union all 
    select '[STRING]' as col from dual 
) group by cast(col as char([B])); 

funktioniert nur, wenn [A]> = [B], sonst scheitert es auf ORA -01489: Das Ergebnis der String-Verkettung ist zu lang.

Neugierig ...

+0

Vielen Dank für Ihre Antwort und die Abstraktion des Problems. Es ist in der Tat immer noch ein sehr seltsames Verhalten. Ich bezeichne die Antwort nicht als richtig, da es eher eine Ergänzung zu meiner Frage als eine Erklärung ist. –