Pracuję z kwerendą zawierającą wyrażenie „CASE” w klauzuli „WHERE”. Ale SQL Server 2008 daje pewne błędy podczas jego wykonywania. Czy ktoś może mi pomóc z poprawnym zapytaniem? Oto zapytanie:
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
źródło
źródło
Odpowiedzi:
Po pierwsze,
CASE
oświadczenie musi stanowić część wyrażenia, a nie samo wyrażenie.Innymi słowy, możesz mieć:
Ale to nie zadziała tak, jak je napisałeś, np:
Możesz mieć więcej szczęścia, używając połączonych stwierdzeń OR w ten sposób:
Chociaż tak czy inaczej nie jestem pewien, jak świetny będzie plan zapytań. Te typy oszustw w
WHERE
klauzuli często uniemożliwiają optymalizatorowi zapytań korzystanie z indeksów.źródło
co.personentered
nie jest zerowe, w opcji 1 i 2. Teraz wystarczy trzecia opcja. Ale chcę to wiedzieć ... !!where case c when 1 then (DescriptionCode is null) else descriptioncode is not null end
, aleIncorrect syntax near the keyword 'is'.
To powinno na razie rozwiązać twój problem, ale muszę ci przypomnieć, że to nie jest dobre podejście:
źródło
Spróbuj wykonać następujące czynności:
źródło
Myślę, że początek Twojego zapytania powinien wyglądać tak:
ALE
to, co jest w ogonie, jest całkowicie niezrozumiałe
źródło
Tam
WHERE
część można by napisać tak:źródło
Możesz też spróbować jak poniżej np. aby wyświetlić tylko przesyłki wychodzące
źródło
Dzięki za to pytanie, właściwie szukam czegoś innego co jest w poniższym zapytaniu. to może komuś pomóc.
powyższe zapytanie ma na celu wypełnienie listy rozwijanej, w której puste wartości są wyświetlane jako „(puste)”. Również jeśli przekażemy tę wartość do klauzuli sql where, aby uzyskać puste wartości z innymi wartościami, nie wiem, jak sobie z tym poradzić. I w końcu wymyśliłem poniższe rozwiązanie, które może komuś pomóc.
oto jest,
źródło
oto moje rozwiązanie
Regads Davy
źródło
To działa
źródło
Spróbuj wykonać następujące czynności:
źródło
źródło
Używaj w ten sposób.
źródło