2013-09-24 9 views
5

Hi każdy chcę użyć instrukcji case się Dołącz użyciu tej kwerendy i got błądkomunikat w przypadku użycia Dołącz

Select CONVERT(VARCHAR(10), SII.SIDATE,103)DATE,SII.SALEID,SII.ItemName,SI.TenancyID 

FROM F_SALESINVOICEITEM SII 
INNER JOIN F_SALESINVOICE SI ON SI.SALEID=SII.SALEID 
INNER JOIN #TempTableSearch ts ON CASE 
WHEN ts.ACCOUNTTYPE = '1' THEN ts.ACCOUNTID=SI.TENANCYID 
    WHEN ts.ACCOUNTTYPE='2' THEN ts.ACCOUNTID=SI.EMPLOYEEID 
    WHEN ts.ACCOUNTTYPE='3' THEN ts.ACCOUNTID=SI.SUPPLIERID 
    WHEN ts.ACCOUNTTYPE='4' THEN ts.ACCOUNTID=SI.SALESCUSTOMERID 

Error

Niepoprawna składnia w pobliżu '='.

Proszę pomóż mi rozwiązać ten błąd.

Odpowiedz

13

powinno być,

ON 
ts.ACCOUNTID = CASE 
        WHEN ts.ACCOUNTTYPE = '1' THEN SI.TENANCYID 
        WHEN ts.ACCOUNTTYPE = '2' THEN SI.EMPLOYEEID 
        WHEN ts.ACCOUNTTYPE = '3' THEN SI.SUPPLIERID 
        WHEN ts.ACCOUNTTYPE = '4' THEN SI.SALESCUSTOMERID 
       END 
0

masz błąd składni. Brakuje tam END.

6

Zamiast Case, Wolałbym to zrobić:

Select CONVERT(VARCHAR(10), SII.SIDATE,103)DATE,SII.SALEID,SII.ItemName,SI.TenancyID 
FROM F_SALESINVOICEITEM SII 
INNER JOIN F_SALESINVOICE SI ON SI.SALEID=SII.SALEID 
INNER JOIN #TempTableSearch ts ON 
     (ts.ACCOUNTTYPE='1' AND ts.ACCOUNTID=SI.TENANCYID) 
    OR (ts.ACCOUNTTYPE='2' AND ts.ACCOUNTID=SI.EMPLOYEEID) 
    OR (ts.ACCOUNTTYPE='3' AND ts.ACCOUNTID=SI.SUPPLIERID) 
    OR (ts.ACCOUNTTYPE='4' AND ts.ACCOUNTID=SI.SALESCUSTOMERID) 

Aby wyjaśnić, dlaczego kwerenda nie działa dla Ciebie: składnia CASE wymaga END na końcu klauzuli . Będzie działać, jak sugerują inne proponowane rozwiązania, ale uważam, że ta wersja jest wygodniejsza do zrozumienia - chociaż ta część jest wysoce subiektywna.

+0

Wykonałeś zapytanie, ale nie wyjaśniłeś dokładnie, co było przyczyną błędu. – nimdil

1

można to zrobić, więc nie masz szans na błędnie coś (zauważ, że ACCOUNTTYPE i ACCOUNTID używane tylko w razie potrzeby, nie trzeba skopiować i wkleić go)

select 
    convert(varchar(10), SII.SIDATE,103) as DATE, 
    SII.SALEID, SII.ItemName, SI.TenancyID 
from F_SALESINVOICEITEM as SII 
    inner join F_SALESINVOICE as SI on SI.SALEID = SII.SALEID 
    outer apply (
     '1', SI.TENANCYID 
     '2', SI.EMPLOYEEID 
     '3', SI.SUPPLIERID 
     '4', SI.SALESCUSTOMERID 
    ) as C(ACCOUNTTYPE, ACCOUNTID) 
    inner join #TempTableSearch as ts on 
     ts.ACCOUNTTYPE = C.ACCOUNTTYPE and ts.ACCOUNTID = C.ACCOUNTID 
0

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.

Powiązane problemy