2013-10-15 4 views
5

Ich versuche, zu sortieren alphabetisch Groß- und Kleinschreibung mit COLLATE NOCASE aber immer Fehlerwie von Groß- und Kleinschreibung alphabetischer Reihenfolge mit COLLATE NOCASE

ORA - 00933 SQL command not properly ended.

unten ist die Abfrage Ich bin Brennen sortieren:

SELECT LPN.LPN_ID, 
     LPN.TC_ORDER_ID, 
     ORDERS.D_NAME, 
     ORDERS.PURCHASE_ORDER_NUMBER AS ORDER_PURCHASE_ORDER_NUMBER, 
     ORDERS.D_NAME AS D_NAME_2, LPN.LPN_NBR_X_OF_Y 
    FROM ORDERS ORDERS, 
     LPN LPN 
WHERE ORDERS.ORDER_ID=LPN.ORDER_ID 
ORDER BY ORDERS.D_NAME COLLATE NOCASE DESC 

Ich habe hier überprüft, um dies zu versuchen, aber immer noch Fehler How to use SQL Order By statement to sort results case insensitive? Anregungen bitte?

Antwort

5

Oracle unterstützt COLLATE NOCASE Option der order by Klausel nicht. Um der Lage sein, Groß- und Kleinschreibung Bestellung ausführen Sie haben zwei Möglichkeiten:

  1. Set NLS_COMP='ANSI' und 'NLS_SORT=BINARY_CI' bedeutet CI Suffix Groß- und Kleinschreibung, Sitzung oder systemweit unter Verwendung alter session oder alter system Anweisung:

    alter session set nls_comp='ANSI'; 
    alter session set nls_sort='BINARY_CI'; 
    with t1(col) as(
    select 'A' from dual union all 
    select 'a' from dual union all 
    select 'b' from dual union all 
    select 'B' from dual 
    ) 
    select * 
        from t1 
    order by col 
    

    Ergebnis:

    COL 
    --- 
    A 
    a 
    b 
    B 
    
  2. ändern Fall des char acter literal unter Verwendung entweder upper() oder lower() Funktion.

    with t1(col) as(
        select 'A' from dual union all 
        select 'a' from dual union all 
        select 'b' from dual union all 
        select 'B' from dual 
    ) 
        select * 
        from t1 
        order by upper(col) 
    

    Ergebnis:

    COL 
    --- 
    A 
    a 
    b 
    B 
    

bearbeiten

but i need the UpperCase to preceed any LowerCase eg. Alan, alan, Brian, brian, Cris

Dies ist nicht die Groß- und Kleinschreibung Ordnung, eher ganz in gewissem Sinne Gegenteil. Als eine der Optionen können Sie die folgende tun gewünschtes Ergebnis zu produzieren:

with t1(col) as(
    select 'alan' from dual union all 
    select 'Alan' from dual union all 
    select 'brian' from dual union all 
    select 'Brian' from dual union all 
    select 'Cris' from dual 
) 
select col 
    from (select col 
       , case 
        when row_number() over(partition by lower(col) 
               order by col) = 1 
        then 1 
        else 0 
       end as rn_grp 
      from t1 
     ) 
    order by sum(rn_grp) over(order by lower(col)) 

Ergebnis:

COL 
----- 
Alan 
alan 
Brian 
brian 
Cris 
+0

ich die zweite Option Sie niedriger gab() .. das funktioniert gut aber ich brauche den groß- ein zu vorausgehen y LowerCase z. Alan, Alan, Brian, Brian, Cris .. – maddy

3

COLLATE NOCASE nicht mit Oracle arbeiten, versuchen Sie dies:

SELECT LPN.LPN_ID, 
    LPN.TC_ORDER_ID, 
    ORDERS.D_NAME, 
    ORDERS.PURCHASE_ORDER_NUMBER AS ORDER_PURCHASE_ORDER_NUMBER, 
    ORDERS.D_NAME AS D_NAME_2, 
    LPN.LPN_NBR_X_OF_Y 
FROM orders orders, 
    lpn lpn 
where orders.order_id=lpn.order_id 
ORDER BY lower(orders.d_name) DESC; 
+1

ORDER BY ** untere/obere (orders.d_name) ** DESC wird den Trick tun – Vishrant

2

Seit 10 g Es gibt eine Funktion NLSSORT, die ziemlich genau was Nicholas Krasnov described tut, aber erfordert keine Änderung des Systems oder der Sitzung.

so können Sie so etwas wie dies versuchen:

SELECT LPN.LPN_ID, LPN.TC_ORDER_ID, ORDERS.D_NAME, ORDERS.PURCHASE_ORDER_NUMBER 
AS ORDER_PURCHASE_ORDER_NUMBER, ORDERS.D_NAME AS D_NAME_2, LPN.LPN_NBR_X_OF_Y 
FROM ORDERS ORDERS, LPN LPN 
WHERE ORDERS.ORDER_ID=LPN.ORDER_ID 
ORDER BY nlssort(ORDERS.D_NAME, 'NLS_SORT = binary_ci') desc 

Hinweis Diese direkt in einer UNION verwenden können, oder werden Sie die folgende Fehlermeldung erhalten:

ORA-01785: ORDER BY item must be the number of a SELECT-list expression.

Stattdessen müssen Sie um es einzuwickeln:

SELECT * FROM (SELECT a, b FROM x, y UNION SELECT c, d FROM m, n) 
ORDER BY nlssort(a, 'nls_sort=binary_ci') DESC 
Verwandte Themen