2011-01-16 17 views
8

¿Existe la posibilidad de ordenar el resultado por una cláusula ORDER que contiene una expresión, algo así comoSQL Server 2005 ORDER BY con una expresión

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

o también una expresión más compleja?

ACTUALIZACIÓN:

Mientras tanto he encontrado una posibilidad de resolver el problema anterior:

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

sin embargo, la pregunta sigue siendo, si hay una posibilidad de ordenar directa por una expresión.

+1

El motivo por el que su primer intento no funciona es que SQL Server necesita que convierta su expresión booleana en un tipo de datos que pueda ordenar. Si trataste de usar esa expresión 'colX1 IS NOT NULL' en una declaración SELECT, tampoco funcionaría. Como ha encontrado en su segunda declaración, puede ORDER BY una expresión, siempre y cuando sea válida y pueda colocarla en una declaración SELECT. – Rory

+0

@Rory: Fue un mal ejemplo y esto me llevó en una dirección equivocada (porque se trata de booleanos). Tu comentario debe ser la respuesta aceptada, responde mi pregunta principal. Aceptaré la respuesta de gbn, porque muestra por qué mi ejemplo (y mi primer intento) no fue muy bueno. Gracias. – HCL

Respuesta

15

No, SQL Server no admite la conversión directa de una expresión de verdadero/falso.

En mi humilde opinión, una de las razones es la lógica de 3 valores. Esto tiene 3 resultados, no 2, de cualquiera de las columnas es NULO. El NULL es el primero en SQL en general, siempre Server, pero se puede especificar al final en otro RDBMS.

ORDER BY (colX1 = colX2) 

Usar CASE mitiga este y elimina la ambigüedad

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

Usted tiene que usar CASO según su actualización, así asegurando tipos de datos coincidencia (o al menos implícitamente convertible) en las cláusulas WHEN.

0

Se necesitaría para ponerlo en su selecto primera

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

Es algo así como que de todos modos la parte superior de mi cabeza. http://www.tizag.com/sqlTutorial/sqlcase.php

+0

No, no creo que esto sea cierto, vea mi actualización y las otras publicaciones (y el comentario de Rory). – HCL

+0

Hmmm, aprendí algo nuevo: D – Hawxby

5

puede utilizar

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

+1 Para mi ejemplo, esto es todo. Vea mi comentario sobre la pregunta, por qué no he tomado su respuesta como la aceptada. Gracias por tu respuesta. – HCL

1

se puede pedir por la posición ordinal de la columna, si desea ver los datos que le toque lavar por ... por ejemplo, si desea ordene por la 1ra columna, solo diga 'PEDIR POR 1'. He aquí un ejemplo en el que añado una expresión en la cláusula select .. y luego ordeno por ella en el orden por la cláusula

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

Si publica código, XML o muestras de datos, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "muestras de código" ({}) en la barra de herramientas del editor para formatear y sintaxis. –

+0

+1 Gracias por la punta de la posición ordinal. No lo sabía ... – HCL

Cuestiones relacionadas