2008-11-13 13 views
14

Chciałbym złożyć (MS) zapytanie SQL, która zwraca coś takiego:SQL inline jeśli typ oświadczenie pytanie

Col1 Col2     Col3 
---- --------------------- ------ 
AAA 18.92     18.92 
BBB 20.00     40.00 
AAA 30.84     30.84 
BBB 06.00     12.00 
AAA 30.84     30.84 
AAA 46.79     46.79 
AAA 86.40     86.40 

gdzie Col3 jest równa COL2 gdy Col1 = AAA i Col3 jest dwukrotnie Col2 kiedy Col1 = BBB. Czy ktoś może wskazać mi kierunek w kierunku przeciwnym?

+1

Wiem, że to stare pytanie, ale teraz, gdy mamy SQL Server 2012, można użyć 'IIF' http://stackoverflow.com/a/23991354 – jahu

Odpowiedz

32

Nie wspomniano, jakiego rodzaju bazy danych używasz. Oto coś, co będzie działać w SQL Server:

SELECT Col1, Col2, 
    CASE WHEN Col1='AAA' THEN Col2 WHEN Col1='BBB' THEN Col2*2 ELSE NULL END AS Col3 
FROM ... 
+0

Ooh: nie myślałem o tym interpretacja pytania. Myślałem, że prosi o złożoną klauzulę. Będzie ciekawie zobaczyć, z którego korzysta. –

+0

Myślę, że chce filtrować rekordy. –

1
select * 
from yourtable 
where (Col3 = col2 AND Col1 = 'AAA') OR 
    (Col3 = (2*Col2) AND Col1='BBB') 
+0

Ooh: nie pomyślałem o tej interpretacji pytania. Myślałem, że prosi o kolumnę obliczeniową. Będzie chciał zobaczyć, z którego korzysta. –

2

To zależy od smaku SQL. Case/When działa z serwerem SQL (i prawdopodobnie z innymi).

Select Col1, Col2, 
     Case When Col1 = 'AAA' Then Col2 Else Col2 * 2 End As Col3 
From YourTable 
0

Czasami wartości są null, dzięki czemu mogą one być traktowane tak:

select Address1 + (case when Address2='' then '' else ', '+Address2 end) +    
    (case when Address3='' then '' else ', '+ Address3 end) as FullAddress from users 
7

Można również użyć ISNULL lub COALESCE funkcje jak zatem powinien wartości być null:

SELECT ISNULL(Col1, 'AAA') AS Col1, 
     ISNULL(Col2, 0) AS Col2, 
     CASE WHEN ISNULL(Col1, 'AAA') = 'BBB' THEN ISNULL(Col2, 0) * 2 
      ELSE ISNULL(Col2) 
     END AS Col3 
FROM Tablename