2012-04-18 9 views
7

tengo la siguiente tabla:Si el campo es nulo, tire de ciertos campos; de lo contrario, tirar de otros campos

TestTable 
    ColumnA 
    Column1 
    Column2 
    Column3 
    Column4 

Quiero escribir una instrucción SQL simple que comprueba ColumnA y dependiendo de si es nulo o no devuelve ciertas columnas.

Algo así como (pseudo):

If ColumnA Is Null 
    SELECT ColumnA, Column1, Column2 
    FROM TestTable 
Else 
    SELECT ColumnA, Column3, Column4 
    FROM TestTable 

¿Alguna idea?

+0

¿Qué base de datos está utilizando? Tienes etiquetas de Oracle y SQL Server. –

Respuesta

3

que puedo pensar de un par de rutas, ninguno es necesariamente bastante ...

Las personas con frecuencia encuentra el primero, luego busca algo mejor. No estoy seguro de que realmente haya algo mejor.

SELECT 
    ColumnA, 
    CASE WHEN ColumnA IS NULL THEN Column1 ELSE Column2 END AS ColumnB, 
    CASE WHEN ColumnA IS NULL THEN Column3 ELSE Column4 END AS ColumnC 
FROM 
    yourTable 

O ...

SELECT 
    yourTable.ColumnA, 
    subTable.ColumnB, 
    subTable.ColumnC 
FROM 
    yourTable 
CROSS APPLY 
(
    SELECT yourTable.Column1 AS ColumnB, yourTable.Column3 AS ColumnC WHERE yourTable.ColumnA IS NULL 
    UNION ALL 
    SELECT yourTable.Column2 AS ColumnB, yourTable.Column4 AS ColumnC WHERE yourTable.ColumnA IS NOT NULL 
) 
    AS subTable 

O ...

SELECT 
    ColumnA, 
    Column1 AS ColumnB, 
    Column2 AS ColumnC 
FROM 
    yourTable 
WHERE 
    ColumnA IS NULL 

UNION ALL 

SELECT 
    ColumnA, 
    Column2 AS ColumnB, 
    Column4 AS ColumnC 
FROM 
    yourTable 
WHERE 
    ColumnA IS NOT NULL 
1

Una más manera de pelar este gato en particular:

SELECT ColumnA, 
     NVL2(ColumnA, Column3, Column1), 
     NVL2(ColumnA, Column4, Column2) 
    FROM TestTable 

Compartir y disfrutar.

+0

Nota: 'NVL2()' toma los parámetros de cadena, lo que significa una conversión implícita, y luego posiblemente de vuelta al tipo de datos nativo según la necesidad. – MatBailie

+0

@Dems 'NVL2' funciona con" cualquier tipo de datos excepto LONG ": http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions120.htm#i91806 (Aunque si la columna [A | 1 | 2 | 3 | 4] son ​​tipos diferentes, sin duda podría haber problemas, pero eso es cierto para cualquiera de las respuestas aquí.) –

+0

@Dems: según los documentos para NVL2 en http://docs.oracle.com/cd/B28359_01 /server.111/b28286.pdf parece que si el segundo argumento es numérico, la base de datos determinará qué argumento tiene la precedencia numérica más alta y devolverá un valor de ese tipo. También hay una nota de que aceptará parámetros de cualquier tipo, excepto que LONG está prohibido para el segundo y tercer argumentos. Al menos esto parece ser así bajo 11.1. YMMV. –

Cuestiones relacionadas