Musisz zrozumieć, że CASE ... END
blok NIE jest równoważny z IF { }
z języków podobnych do języka C. Jest to raczej odpowiednik rozbudowanej wersji operatora w języku C-podobnym. Co to znaczy, że blok CAŁKOWITA CASE
musi zasadniczo oceniać pojedynczą wartość i że ta wartość musi być tego samego typu, bez względu na to, który przypadek bloku jest wykonywany. Oznacza to, że:
CASE
WHEN ts.ACCOUNTTYPE = '1' THEN ts.ACCOUNTID=SI.TENANCYID ...
END
jest fundamentalnie błędna, chyba że pracują nad wersją bazy danych, która pozwoli Ci bool wartość jako wartość (SQL Server nie pozwoli to na przykład, ale myślę, że niektóre z wersją MySQL używany do pozwól na to - nie jestem tego pewien). Prawdopodobnie powinien napisać coś takiego:
CASE
WHEN ts.ACCOUNTTYPE = '1' AND ts.ACCOUNTID=SI.TENANCYID THEN 1
WHEN ts.ACCOUNTTYPE='2' AND ts.ACCOUNTID=SI.EMPLOYEEID THEN 1
WHEN ts.ACCOUNTTYPE='3' AND ts.ACCOUNTID=SI.SUPPLIERID THEN 1
WHEN ts.ACCOUNTTYPE='4' AND ts.ACCOUNTID=SI.SALESCUSTOMERID THEN 1
ELSE 0
END = 1
zauważyć jak cały CASE
blok ocenia na 1 lub 0, a następnie jest on w porównaniu do 1. Oczywiście zamiast 4 WHEN
„s można użyć jednego WHEN
z kombinacji AND
's, OR
' s oraz nawiasy . Oczywiście w tym konkretnym przypadku odpowiedź @ppeterka 66 jest poprawna, ponieważ CASE
nie jest odpowiednia do tego, co naprawdę chciałeś zrobić - próbuję tylko wyjaśnić, czym naprawdę jest CASE
.
Wykonałeś zapytanie, ale nie wyjaśniłeś dokładnie, co było przyczyną błędu. – nimdil