Estou trabalhando com uma consulta que contém a instrução "CASE" dentro da cláusula "WHERE". Mas o SQL Server 2008 está apresentando alguns erros ao executá-lo. Alguém pode me ajudar com a consulta correta? Aqui está a 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
user1018213
fonte
fonte
Respostas:
Em primeiro lugar, a
CASE
declaração deve fazer parte da expressão, não a própria expressão.Em outras palavras, você pode ter:
Mas não vai funcionar da maneira que você os escreveu, por exemplo:
Você pode ter mais sorte usando instruções OR combinadas como esta:
Embora, de qualquer forma, não tenha certeza de quão bom será um plano de consulta. Esses tipos de travessuras em uma
WHERE
cláusula geralmente impedem o otimizador de consulta de utilizar índices.fonte
co.personentered
não é nulo, nas opções 1 e 2. Agora, a 3ª opção é suficiente. Mas eu quero saber disso ... !!where case c when 1 then (DescriptionCode is null) else descriptioncode is not null end
, mas mostra o erro comoIncorrect syntax near the keyword 'is'.
Isso deve resolver seu problema por enquanto, mas devo lembrá-lo de que não é uma boa abordagem:
fonte
Experimente o seguinte:
fonte
Acho que o início da sua consulta deve ser assim:
MAS
o que está na cauda é completamente incompreensível
fonte
A
WHERE
parte poderia ser escrita assim:fonte
Você também pode tentar como abaixo, por exemplo. para mostrar apenas remessas de saída
fonte
Obrigado por esta pergunta, na verdade estou procurando outra coisa que está na consulta abaixo. isso pode ajudar alguém.
a consulta acima é para preencher uma lista suspensa cujos valores em branco são exibidos como "(em branco)". Além disso, se passarmos esse valor para a cláusula where do sql para obter valores em branco com outros valores, não sei como lidar com isso. E finalmente veio a solução abaixo que pode ajudar alguém.
Aqui está ,
fonte
aqui está minha solução
Regads Davy
fonte
Isso funciona
fonte
Experimente o seguinte:
fonte
fonte
Use desta forma.
fonte