2011-05-29 22 views
6

Tengo una tabla que contiene 2 tipos de texto dentro de una columna. El primer tipo es una cadena de dirección de correo electrónico (ex [email protected]) y el segundo es el nombre de una persona (John Doe)Pedido de consulta SQlite por caso

Estoy utilizando esta consulta para ordenar los datos de modo que primero las filas que no tienen el carácter @ se muestran a continuación, los que lo hacen tienen que:

SELECT * 
    FROM Name 
ORDER BY CASE 
      WHEN displayName LIKE '%@%' THEN 1 
      ELSE 2 
     END 

entonces, ¿qué puedo hacer es obtener los casos a ser clasificado de forma ascendente por lo que he los nombres ordenados por carta ascendente siguiendo los mensajes de correo electrónico ordenados por letras ascendentes

Respuesta

13

Use:

SELECT n.* 
    FROM NAME n 
ORDER BY CASE 
      WHEN displayName LIKE '%@%' THEN 1 
      ELSE 2 
     END, n.displayname COLLATE NOCASE 

Los soportes ORDER BY cláusula más de una columna, pero la prioridad se lee de izquierda a derecha. Por lo tanto, los valores displayname con una "@" en ellos están en la parte superior, y luego ordenados por el valor displayname en cada agrupación (según la instrucción CASE).

Debe tener en cuenta el uso del COLLATE operator para la comparación insensible a mayúsculas y minúsculas.

+0

bien esto funciona pero no completamente. se necesita contar si la carta está en mayúsculas o no. me da los que comienzan con la letra upercase primero ordenados alfabéticamente y luego los que comienzan con minúsculas ordenados alfabéticamente y luego hace lo mismo con los correos electrónicos. – DArkO

+0

Ok, lo descubrí. se agregó UPPER (displayName) después del final, – DArkO

+0

@DArko: 'COLLATE' ofrece más funcionalidades - vea la actualización. –

3

Básicamente, se vería así:

Select * 
FROM Name 
Order by case when displayName LIKE '%@%' then 1 else 2 end, displayName 

Usted se acaba de añadir un segundo elemento que debe clasificarse en la lista. Esto ordenará primero por la columna 1 o 2 y luego clasificará esos resultados por el nombre real.

Si su cotejo no permite la clasificación que desea, se puede modificar el ORDER BY ligeramente para acomodar este modo:

Select * 
FROM Name 
Order by case when displayName LIKE '%@%' then 1 else 2 end, UPPER(displayName)