Estoy trabajando con una consulta que contiene la declaración "CASE" dentro de la cláusula "WHERE". Pero SQL Server 2008 está dando algunos errores al ejecutarlo. ¿Alguien puede ayudarme con la consulta correcta? Aquí está la consulta:
SELECT
tl.storenum 'Store #',
co.ccnum 'FuelFirst Card #',
co.dtentered 'Date Entered',
CASE st.reasonid
WHEN 1 THEN 'Active'
WHEN 2 THEN 'Not Active'
WHEN 0 THEN st.ccstatustypename
ELSE 'Unknown'
END 'Status',
CASE st.ccstatustypename
WHEN 'Active' THEN ' '
WHEN 'Not Active' THEN ' '
ELSE st.ccstatustypename
END 'Reason',
UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) 'Person Entered',
co.comments 'Comments or Notes'
FROM
comments co
INNER JOIN cards cc ON co.ccnum=cc.ccnum
INNER JOIN customerinfo ci ON cc.customerinfoid=ci.customerinfoid
INNER JOIN ccstatustype st ON st.ccstatustypeid=cc.ccstatustypeid
INNER JOIN customerstatus cs ON cs.customerstatuscd=ci.customerstatuscd
INNER JOIN transactionlog tl ON tl.transactionlogid=co.transactionlogid
LEFT JOIN stores s ON s.StoreNum = tl.StoreNum
WHERE
CASE LEN('TestPerson')
WHEN 0 THEN co.personentered = co.personentered
ELSE co.personentered LIKE '%TestPerson'
END
AND cc.ccnum = CASE LEN('TestFFNum')
WHEN 0 THEN cc.ccnum
ELSE 'TestFFNum'
END
AND CASE LEN('2011-01-09 11:56:29.327')
WHEN 0 THEN co.DTEntered = co.DTEntered
ELSE
CASE LEN('2012-01-09 11:56:29.327')
WHEN 0 THEN co.DTEntered >= '2011-01-09 11:56:29.327'
ELSE co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327'
END
END
AND tl.storenum < 699
ORDER BY tl.StoreNum
sql
sql-server
case
usuario1018213
fuente
fuente
Respuestas:
En primer lugar, la
CASE
declaración debe ser parte de la expresión, no la expresión en sí.En otras palabras, puede tener:
Pero no funcionará de la forma en que los ha escrito, por ejemplo:
Es posible que tenga más suerte utilizando declaraciones OR combinadas como esta:
Aunque, de cualquier manera, no estoy seguro de qué tan bueno será un plan de consulta. Estos tipos de travesuras en una
WHERE
cláusula a menudo evitarán que el optimizador de consultas utilice índices.fuente
co.personentered
no es nulo, en la opción 1 y 2. Ahora la 3ª opción es suficiente. ¡¡Pero quiero saber eso ... !!where case c when 1 then (DescriptionCode is null) else descriptioncode is not null end
, pero muestra el error comoIncorrect syntax near the keyword 'is'.
Esto debería resolver su problema por el momento, pero debo recordarle que no es un buen enfoque:
fuente
Intente lo siguiente:
fuente
Creo que el comienzo de su consulta debería verse así:
PERO
lo que hay en la cola es completamente incomprensible
fuente
Esa
WHERE
parte podría escribirse así:fuente
También puede probar como a continuación, por ejemplo. para mostrar solo los envíos salientes
fuente
Gracias por esta pregunta, en realidad estoy buscando algo más que se encuentra en la siguiente consulta. esto puede ayudar a alguien.
La consulta anterior es para completar el menú desplegable cuyos valores en blanco se muestran como "(en blanco)". Además, si pasamos este valor a la cláusula SQL where para obtener valores en blanco con otros valores, no sé cómo manejar eso. Y finalmente se le ocurrió la siguiente solución que puede ayudar a alguien.
aquí está ,
fuente
aquí está mi solución
Regads Davy
fuente
Esto funciona
fuente
Intente lo siguiente:
fuente
fuente
Úselo de esta manera.
fuente