Was ist falsch mit dem Fall, wenn dann in meiner Wo-Klausel?

Meine Anforderung: Wenn 'Name' UND 'Adresse' nicht null ist, dann nehmen Sie Werte von beiden in Sorge. Wenn einer von ihnen null ist, aber die anderen sind gegeben, nur "suchen" für die gegebene.

SELECT * from myTable where (1=1) AND (@p_ID is null or [Id] = @p_ID) AND case when [Name] IN (SELECT keyValue FROM @p_PersonalData) then ((SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0 OR ([Address] IN (SELECT dictKey FROM @p_PersonalData)) AND ([Name] IN (SELECT keyValue FROM p_PersonalData))) else ((SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0 OR ([Address] IN (SELECT dictKey FROM p_PersonalData)) ORDER BY [...] 

info: Es funktioniert perfekt ohne den Fall. Die select-Aussagen und die und's / or's sind ganz gut

Das Problem ist, dass das SQL server Management Studio rot das Gleichheitszeichen bei '= 0' unterstreicht und sagt, dass er erwartet, dass AND oder THEN, aber da ist ein 'dann' …

Sie haben Bedingungen in Ihren "then / else" Blöcken. Dinge wie folgt:

 else ((SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0 OR ([Address] IN (SELECT dictKey FROM p_PersonalData)) 

sind ungültige Syntax.

Versuche es stattdessen. Beachten Sie, dass der Fall in Ihrer WHERE-Klausel wahrscheinlich sehr ineffizient ist, und Sie sollten erwägen, diese Abfrage in einer wesentlicheren Weise zu refactoring. Aber das soll dich aus dem Boden bringen

 SELECT * from myTable where (1=1) AND (@p_ID is null or [Id] = @p_ID) AND case when [Name] IN (SELECT keyValue FROM @p_PersonalData) then case when ( (SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0 OR ([Address] IN (SELECT dictKey FROM @p_PersonalData)) AND ([Name] IN (SELECT keyValue FROM p_PersonalData)) ) then 1 else 0 end else case when ( (SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0 OR ([Address] IN (SELECT dictKey FROM p_PersonalData) ) then 1 else 0 end end = 1 ORDER BY [...]