2012-02-27 28 views
15

Poszukuję sposobu budowania instrukcji case w zapytaniu sql select przy użyciu znaków mniejszych i większych niż. Na przykład, chcę, aby wybrać pozycję na podstawie zmiennej:Stosowanie znaków porównania wewnątrz instrukcji sql case

DECLARE @a INT 
SET @a = 0 

SELECT CASE 
     WHEN @a < 3 THEN 0 
     WHEN @a = 3 THEN 1 
     WHEN @a > 3 THEN 2 
     END 

Chciałbym napisać go jako:

DECLARE @a INT 
SET @a = 0 

SELECT CASE @a 
     WHEN < 3 THEN 0 
     WHEN 3 THEN 1 
     WHEN > 3 THEN 2 
     END 

... ale SQL nie pozwala mi korzystać z < i> znaki w ten sposób. Czy istnieje sposób, że mogę to zrobić to SQL 2005, czy też muszę użyć kodu jak w pierwszym.

Powodem, dla którego chcemy kodu tylko raz, jest to, że sprawiłoby, że kod byłby dużo czytelniejszy/łatwiejszy w utrzymaniu, a także dlatego, że nie jestem pewien, czy SQL Server będzie musiał wykonać obliczenia dla każdej instrukcji CASE.

Czekam na VB.NET case equivelent:

Select Case i 
    Case Is < 100 
     p = 1 
    Case Is >= 100 
     p = 2 
End Select 

Może nie jest to możliwe w SQL i to jest ok, po prostu chcę, aby to potwierdzić.

+2

Opcja 'CASE' działa jak liter lub przejść w większości innych języki programowania. Nie widzę sensu twojej potrzeby. –

+0

Przepraszam, koniec mojego pytania został przerwany. Daj mi znać, jeśli nadal nie rozumiesz, co próbuję osiągnąć. – Greg

+0

Wyrażenie CASE spowoduje zwarcie i oceni sprawy tylko do momentu, gdy jedna z nich jest prawdziwa. Nie sądzę, że jest jakaś korzyść z innego podejścia. –

Odpowiedz

19

można użyć funkcję SIGN jak

DECLARE @a INT 
SET @a = 0 

SELECT CASE SIGN(@a - 3) 
     WHEN -1 THEN 0 
     WHEN 0 THEN 1 
     WHEN 1 THEN 2 
     END 

Jeśli @a jest mniejszy niż 3, a następnie @a - 3 skutkuje negatywnym int, w którym powraca SIGN-1.

Jeśli @a ma wartość 3 lub większą, wówczas ZNAK zwraca wartość 0 lub 1.


Jeśli wyjście chcesz to 0, 1 i 2, a następnie można uprościć jeszcze bardziej:

DECLARE @a INT 
SET @a = 0 

SELECT SIGN(@a - 3) + 1 
+0

Dzięki, dam to odejść – Greg

+0

Nie widzę, jak to jest łatwiejsze w utrzymaniu. Każdy, kto zna SQl znajdzie oryginalne stwierdzenie, że OP nie podobało się, ale które działa jaśniej. – HLGEM

+0

@HLGEM Zgodzę się również z tobą, jeśli '@ a' jest tylko prostym wyrażeniem, ale według OP,' @ a' jest długim, skomplikowanym wyrażeniem, którego nie chce powtórzyć trzykrotnie w opisie sprawy. Tak więc, myślę, że moje lub Andriy M's rozwiązania są odpowiednie, aby rozwiązać swój problem. –

6

Korzystanie SIGN jak suggested by @Jose Rui Santos wydaje piękny obejścia. Alternatywą mogłoby być przypisać wyraz aliasu, użyj podselekcji i przetestować wyrażenie (używając jego alias) w zewnętrznym wybrać:

SELECT 
    …, 
    CASE 
    WHEN expr < 3 THEN … 
    WHEN expr > 3 THEN … 
    END AS … 
FROM (
    SELECT 
    …, 
    a complex expression AS expr 
    FROM … 
    … 
) 
1
SELECT 
CASE 
WHEN ColumnName >=1 and ColumnName <=1 THEN 'Fail' 
WHEN ColumnName >=6 THEN 'Pass' 
ELSE 'Test' 
END 
FROM TableName 
+0

Pierwotne pytanie brzmiało: jak uzyskać warunek, aby nie pojawiać się w każdym wierszu. To właściwie nie odpowiada na pytanie, ponieważ nadal będę musiał powtórzyć równanie na dwóch liniach i przyjmijmy, że to jest inne. – Greg

+0

Nie mogę tego zrobić, ponieważ niekoniecznie rozwiązuje oryginalne pytanie, ale rozwiązał mój problem. Dzięki. Wystarczy, że przeniesiemy kolumnęNazwa z linii "CASE" do każdej z linii "KIEDY". – Ads

Powiązane problemy