2010-11-02 16 views
5

Tenga paciencia con esto, esto es bastante difícil de explicar y no estoy seguro si estoy usando la terminología correcta.SQL: Selección condicional dentro de Conditional Select

Necesito hacer una selección algo complicada. En realidad, es una declaración select que decide condicionalmente qué campo usar para filtrar la selección. Si un determinado campo de fecha no es nulo, necesito verificar que el valor en ese campo esté dentro de un cierto rango. De lo contrario, si ese campo de fecha es nulo necesito comprobar otro campo, el campo int, en la misma mesa se encuentra dentro de un cierto rango:

Pseudocódigo:

If [Date] is not null 
    Get sum (table.value) for rows Date >= dateValue and Date < dateValue 
Else 
    Get sum (table.value) for rows Int >= intValue and Int < intValue 

Mi intento actual:

SELECT CASE WHEN a.Date IS NOT NULL THEN 
(SUM(CASE WHEN (a.Date >= cal.Date) THEN ABS(a.Value) ELSE 0 END)) 
ELSE 
(SUM(CASE WHEN (b.Days >= 0) THEN ABS(a.Value) ELSE 0 END) 
END AS 'A' 

¿Alguna idea? Pregunte si necesita más información. Gracias de antemano.

+0

por favor revise mi edición – gbn

+0

Yup. Aclamaciones. Originalmente tenía un enunciado o, pero el campo entero se arrastraba incluso si el campo de fecha contenía datos, pero simplemente no estaba dentro del rango. ¡No pensé en agregar un cheque nulo allí! ¡Ay! – Damien

Respuesta

4

Una forma es tener 2 consultas separadas UNION juntas, pero solo una cláusula generará un valor. Esto evita tener declaraciones OR.

SELECT SUM(Value) 
FROM MyTable 
WHERE MyTable.Date >= dateValue and Table.Date < dateValue --NULL Date = false always 
UNION ALL 
SELECT SUM(Value) 
FROM MyTable 
WHERE MyTable.Int >= intValue and Table.Int < intValue 
    AND --ignore this clause if date is NOT NULL 
    MyTable.Date IS NULL 

Editar, con OR:

SELECT SUM(Value) 
FROM MyTable 
WHERE 
    (
     MyTable.Date IS NOT NULL AND 
     MyTable.Date >= dateValue and Table.Date < dateValue 
    ) 
     OR --actually mutually exclusive 
    (
     MyTable.Date IS NULL AND 
     MyTable.Int >= intValue and Table.Int < intValue 
    ) 
+0

Esto devolverá dos sumas separadas, ni una sola suma de las dos condiciones posibles. Es difícil decir lo que el cartel original pregunta, pero parece que el objetivo es solo un valor. –

+0

@Sam: ¿por qué? La cláusula 1 no da filas, DATE es NULL, por lo que se aplica la cláusula 2. Y la cláusula 2 prueba que DATE es NULL ... if NOT NULL cláusula 1 dará filas (si los filtros de rango son verdaderos por supuesto). Si lo desea, puede agregar FECHA NO NULO a la 1ra cláusula – gbn

+0

Sí, lo siento, es difícil de explicar. De hecho, tengo filas de resultados, pero por razones que no vale la pena consultar aquí, la fila se identifica dentro de un cierto rango, ya sea con un campo de fecha o un campo de enteros, no con ambos. El campo de fecha tiene prioridad, pero si es nulo, uso el campo entero pero, una vez seleccionado, obtengo el mismo valor independientemente de cómo se haya seleccionado. Uf. – Damien

1

Esto funciona y no es tan lejos de la pseudocódigo, siempre y cuando estoy interpretando lo que quiere hacer correctamente.

SELECT SUM(Value) 
FROM T 
WHERE 
     CASE WHEN DateValue IS NOT NULL 
       THEN DateValue BETWEEN FromDate AND ToDate 
       ELSE IntValue BETWEEN FromInt AND ToInt 
       END