2011-01-16 18 views
8

Czy istnieje możliwość zamówienia wynik przez ORDER klauzuli zawierającej wyrażenie, cośSQL Server 2005 ORDER BY z wyrazem

SELECT colX0 FROM tbp_name ORDER BY (colX1 IS NOT NULL) 

lub też bardziej złożone wypowiedzi?

UPDATE:

W międzyczasie znalazłem możliwość rozwiązać powyższy problem:

ORDER BY (case WHEN colX1 IS NULL THEN 1 ELSE 0 END) ASC 

jednak pozostaje pytanie, czy istnieje możliwość zamówienia osobami wyrażenia.

+1

Powodem, dla którego pierwsza próba nie działa, jest to, że SQL Server potrzebuje konwertować wyrażenie binarne na typ danych, według którego można sortować. Jeśli spróbujesz użyć wyrażenia 'colX1 IS NOT NULL' w instrukcji SELECT, to też by nie działało. Jak już zauważyłeś w drugim stwierdzeniu, możesz ORDER BYować wyrażenie, o ile jest ono poprawne, możesz umieścić instrukcję SELECT. – Rory

+0

@Rory: To był zły przykład, a to doprowadziło mnie do złego kierunku (ponieważ dotyczy booleans). Twój komentarz powinien być zaakceptowaną odpowiedzią, odpowiada na moje główne pytanie. Przyjmuję odpowiedź gbn, ponieważ pokazuje, dlaczego mój przykład (i moja pierwsza próba) nie był zbyt dobry. Dzięki. – HCL

Odpowiedz

15

Nie, SQL Server nie obsługuje bezpośrednią konwersję wyrażenia na true/false.

IMHO, jednym z powodów jest logika 3-wartościowa. Ma 3 wyniki, a nie 2, każda z kolumn ma wartość NULL. Wartość NULL jest pierwsza w SQL ogólnie, zawsze Server, ale może być określona jako ostatnia w innych RDBMS.

ORDER BY (colX1 = colX2) 

Korzystanie CASE łagodzi i usuwa tę dwuznaczność

ORDER BY 
    CASE 
     WHEN colX1 = colX2 THEN 1 
     WHEN colX1 <> colX2 THEN 2 
     ELSE 3 NULL case 
    END 

Musisz użyć CASE zgodnie z aktualizacją, a także zapewnienie datatypes mecz (lub przynajmniej w sposób dorozumiany convertable) w KIEDY klauzul.

0

trzeba by umieścić go w wybierz pierwszy

SELECT 
    colX0, 
    CASE WHEN colX1 IS NOT NULL THEN 0 ELSE 1 END AS [COMPUTED1] 
FROM tbp_name 
ORDER BY COMPUTED1 

Jest coś takiego w każdym razie z góry na głowie. http://www.tizag.com/sqlTutorial/sqlcase.php

+0

Nie Nie sądzę, że to prawda, zobacz moją aktualizację i inne posty (i komentarz Rory). – HCL

+0

Hmmm, nauczyłem się czegoś nowego: D – Hawxby

5

można użyć

ORDER BY CASE WHEN condition= 1 THEN 1 ELSE 2 END 
+0

+1 Na mój przykład, to jest to. Zobacz mój komentarz na pytanie, dlaczego nie przyjęłam twojej odpowiedzi jako zaakceptowanej. Dzięki za odpowiedź. – HCL

1

można zamówić przez porządkowej pozycji kolumny, jeśli chcesz zobaczyć dane, że jesteś sortując ... Na przykład, jeśli chcesz zamówienie w pierwszej kolumnie, po prostu powiedz "ZAMÓW PRZEZ 1". Oto przykład, gdzie dodać wyrażenie w klauzuli select .. a potem zamówić przez nią w kolejności przez klauzuli

SELECT colX0, 
(case WHEN colX1 IS NULL THEN 1 ELSE 0 END) 
FROM tbp_name 
ORDER BY 2 
+0

Jeśli opublikujesz kod, XML lub próbki danych, ** proszę ** podświetl te linie w edytorze tekstu i kliknij przycisk "próbki kodu" ({}) na pasku narzędzi edytora, aby ładnie sformatować i podświetlić składnię! –

+0

+1 Dzięki za końcówkę pozycji porządkowej. Nie wiedziałem ... – HCL

Powiązane problemy