2011-06-29 20 views
13

Estoy tratando de implementar un procedimiento de clasificación que se ordenará de acuerdo con el valor de una lista desplegable. Lo que sucede es que cuando se ordena la lista, los campos NULL se reemplazarán por el valor de reemplazo especificado, en este caso ''. Esto se está ordenando primero porque estamos ordenando de forma ascendente, ahora me gustaría ordenar de forma ascendente PERO con valores nulos LAST. ¿Cómo podría implementar esto?Ordenando valores vacíos al final en lugar de primero

ORDER BY l.IsActive DESC, 
     CASE WHEN @SortOrder = 1 THEN n.DisplayName 
      WHEN @SortOrder = 2 THEN CASE ec.IsEquipmentRelated 
              WHEN 1 THEN ISNULL(el.ShopID,'') + 
                ISNULL(ec.EquipmentAbbr,'') + 
                ISNULL(el.ClassSequenceNumber,'') + 
                ISNULL(el.EquipmentComponent,'') + 
                ISNULL(el.CompSequenceNumber,'') 
              WHEN 0 THEN ISNULL(ec.EquipmentAbbr,'') 
              ELSE NULL 
             END 
      ELSE l.DisplayName 
     END 

Editar: Ejecución de MS SQL Server 2008/T-SQL

Editar: @ Joe Stefanelli, he intentado esto, no es la compilación:

ORDER BY l.IsActive DESC, 
    CASE WHEN @SortOrder = 0 THEN l.DisplayName 
     WHEN @SortOrder = 1 THEN CASE WHEN n.DisplayName = '' THEN 2 ELSE 1 END, n.DisplayName 
     WHEN @SortOrder = 2 THEN 
            CASE ec.IsEquipmentRelated 
             WHEN 1 THEN ISNULL(el.ShopID,'') + 
              ISNULL(ec.EquipmentAbbr,'') + 
              ISNULL(el.ClassSequenceNumber,'') + 
              ISNULL(el.EquipmentComponent,'') + 
              ISNULL(el.CompSequenceNumber,'') 
             WHEN 0 THEN ISNULL(ec.EquipmentAbbr,'') 
             ELSE NULL 
            END 
    END 
+0

¿Qué DB estás usando? –

+0

@Matthew Cox la etiqueta tsql me indica que es su servidor SQL. Aunque la versión podría ayudar –

Respuesta

27
... 
ORDER BY CASE WHEN YourField = '' THEN 2 ELSE 1 END, YourField 
+0

, realmente no entiendo la parte 'THEN 2 ELSE 1 END,' ... ¿Estás simplificando? –

+0

@JFB: Solo estoy presentando un elemento artificial para fines de clasificación. Cuando su campo es una cadena vacía, usamos 2 else 1. Por lo tanto, visualice la clasificación terminando en algo como '(1, 'alpha'), (1, 'bravo'), ..., (1, 'zulu '), (2,' ') ' –

+0

ok ... He intentado este enfoque, mira mi edición anterior. –

3

Mejor forma es agregar una columna derivada que tendría valores de orden de clasificación (CASE que verifica si la otra columna es nula) y luego ordenar por esa columna.

2

Su segundo fragmento no se compilará porque está intentando devolver más de un valor en la rama WHEN @SortOrder = 1 del CASE externo. Se podría arreglarlo si ha cometido un par de pequeños cambios en dicha rama:

  1. Cambio 2 y 1 a, por ejemplo, '2' y '1' respectivamente.

  2. Reemplazar la coma (,) con el operador de concatenación (+).

Y por lo que el orden resultante BY se vería así:

ORDER BY 
    l.IsActive DESC, 
    CASE 
    WHEN @SortOrder = 0 THEN l.DisplayName 
    WHEN @SortOrder = 1 THEN 
     CASE WHEN n.DisplayName = '' THEN '2' ELSE '1' END + n.DisplayName 
    WHEN @SortOrder = 2 THEN 
     CASE ec.IsEquipmentRelated 
     WHEN 1 THEN 
      ISNULL(el.ShopID,'') + 
      ISNULL(ec.EquipmentAbbr,'') + 
      ISNULL(el.ClassSequenceNumber,'') + 
      ISNULL(el.EquipmentComponent,'') + 
      ISNULL(el.CompSequenceNumber,'') 
     WHEN 0 THEN 
      ISNULL(ec.EquipmentAbbr,'') 
     ELSE NULL 
     END 
    END 
1

OK! He encontrado una manera de resolver esto usando las tres respuestas combinadas. +1 por cada respuesta! Lo que hice es el primero en crear una columna 'virtual' derivada, la asignación de valores nulos a 1 y los valores no nulos a 0, clasificación que en primer lugar, a continuación, la clasificación de los demás:

ORDER BY 
    l.IsActive DESC, 
    CASE 
    WHEN @SortOrder = 0 THEN (Case When l.DisplayName Is Null Then 1 Else 0 End) 
    WHEN @SortOrder = 1 THEN (Case When n.DisplayName Is Null Then 1 Else 0 End) 
    WHEN @SortOrder = 2 THEN (Case When ec.EquipmentAbbr Is Null Then 1 Else 0 End) 
    END, 
    CASE 
     WHEN @SortOrder = 0 THEN l.DisplayName 
     WHEN @SortOrder = 1 THEN n.DisplayName 
     WHEN @SortOrder = 2 THEN 
       ISNULL(el.ShopID,'') + 
       ISNULL(ec.EquipmentAbbr,'') + 
       ISNULL(el.ClassSequenceNumber,'') + 
       ISNULL(el.EquipmentComponent,'') + 
       ISNULL(el.CompSequenceNumber,'') 
    END 

De esta manera, la clasificación de si un campo es nulo o no se hace antes de que se realice la clasificación real, lo que trae los valores nulos al final.

Cuestiones relacionadas