2012-08-07 10 views
5

Supongamos que tengo alguna tabla en la base de datos SQL con muchos datos y algunas de las filas son casi idénticas, por ejemplo:¿Cómo escribir una consulta que hará una selección inusual distinta de la tabla sql?

|===========================================| 
|   Message       | 
|===========================================| 
|    ...       | 
|-------------------------------------------| 
| account is rejected: <aa>    | 
|-------------------------------------------| 
| account is rejected: <bb>    | 
|-------------------------------------------| 
| mailbox unavailable: 550 550 <[email protected]> | 
|-------------------------------------------| 
| mailbox unavailable: 550 550 <[email protected]> | 
|-------------------------------------------| 
|     ...      | 

para mis propósitos 2 primeras líneas son idénticas y 2 últimas líneas son idénticos, por lo la consulta debe devolver

  1. cuenta es rechazada:
  2. de correo no disponible: 550 550

pensé escribir consulta que seleccionar filas, eliminar caracteres después de '<' signo y la hará DISTINCT, pero no saben cómo hacer todo en SELECT

¿Me pueden ayudar a escribir tales consulta ?

+1

¿Todos los mensajes tendrán un '<' en él? ¿Y siempre querrás ignorar todo desde * first * '<' en adelante? – MatBailie

+0

@Dems, no todos los mensajes tienen un '<' – theateist

Respuesta

5

Lo siguiente elimina todo desde el primer < en adelante.

El GROUP BY es más flexible que el uso de DISTINCT, pero cumple lo mismo en este caso.

La declaración CASE está ahí para dar cabida a la posibilidad de mensajes que no tienen un < en ellos. Si hay siempre a < En su lugar, simplemente utilice la sección ELSE.

SELECT 
    CASE WHEN CHARINDEX('<', Message) = 0 THEN Message ELSE LEFT(Message, CHARINDEX('<', Message)-1)) END AS Message 
FROM 
    yourTable 
GROUP BY 
    CASE WHEN CHARINDEX('<', Message) = 0 THEN Message ELSE LEFT(Message, CHARINDEX('<', Message)-1)) END 
+0

+1 en el punto! :) –

+0

@Dems, ¿puedo usar expresiones regulares en select/case? – theateist

+0

@theateist - No en TSQL a menos que haya escrito el suyo. Pero no es necesario, CHARINDEX() hace lo que necesita ... – MatBailie

Cuestiones relacionadas