• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

wielokrotne case z wieloma przypadkami w where

Object Storage Arubacloud
0 głosów
338 wizyt
pytanie zadane 22 sierpnia 2019 w SQL, bazy danych przez marcinconn Obywatel (1,560 p.)

Witam,

WHERE
	CASE 
		WHEN @zmienna = 'mniejszy' THEN a.TabelaA > c.TabelaC
		WHEN @zmienna = 'większy' THEN a.TabelaA < c.TabelaC

dlaczego czepia się składni w pobliżu a.TabelaA > c.TabelaC(podkreśla znak nierówności) oraz drugiego WHEN?

1 odpowiedź

0 głosów
odpowiedź 22 sierpnia 2019 przez Chess Szeryf (76,710 p.)
edycja 22 sierpnia 2019 przez Chess

O ile się nie mylę nie możesz zastosować takiej konstrukcji, będzie to wyrzucać błąd składni. Możesz zamiast tego napisać prepared statements lub inaczej napisać kod.

Taka składnia jest dozwolona, ale musisz napisać poprawne zapytanie.

SELECT * FROM `hello` WHERE CASE WHEN @var1 = 'orange' THEN id > 5 WHEN @var1 = 'yellow' THEN id > 7 END;

Podaj swoją wersję bazy danych oraz jaka to baza, np. MySQL. Wklej/przepisz tutaj całe zapytanie, bo niewiele z tego wynika.

Pamiętaj jeszcze, że są "dwie składnie case". Jedna jest używana w procedurach/funkcjach, a druga w zapytaniach.

Przy pierwszej składnia jest zakończona "END CASE", a w drugiej samym "END". 

komentarz 23 sierpnia 2019 przez marcinconn Obywatel (1,560 p.)
edycja 23 sierpnia 2019 przez marcinconn
chodzi mi o różną zawartość WHERE, w zależności od wartości parametru, SQL Server

samo polecenie działało dopóki nie zacząłem modyfikować tego where
komentarz 23 sierpnia 2019 przez Chess Szeryf (76,710 p.)
Czy mógłbyś podać pełnieszy przykład. Ten, który nie działa.
komentarz 23 sierpnia 2019 przez marcinconn Obywatel (1,560 p.)
SELECT
a.ColA1,
b.ColB2,
ISNULL(LTRIM(STR(c.colC2)),'0'),
LTRIM(STR(a.colA2)),
d.ColD2
FROM TabelaA AS a
LEFT JOIN TabelaC AS c ON a.ColA1 = c.ColC1
INNER JOIN TabelaB AS b ON b.ColB1 = a.ColA1
INNER JOIN TabelaD AS d ON d.ColD1 = a.ColA1
WHERE
	CASE 
		WHEN @zm1 = 'mn' THEN a.ColA2 > c.ColC2
		WHEN @zm1 = 'wk' THEN a.ColA2 < c.ColC2
	END
ORDER BY a.A1

jak nie było WHERE to działało

komentarz 23 sierpnia 2019 przez Chess Szeryf (76,710 p.)
Przepraszam, ale testuję to na MySQL i u mnie chyba działa. Podaj treść błędu, ponieważ nie za bardzo wiem w czym rzecz.
komentarz 23 sierpnia 2019 przez marcinconn Obywatel (1,560 p.)
SELECT
a.ColA1,
b.ColB2,
ISNULL(LTRIM(STR(c.colC2)),'0'),
LTRIM(STR(a.colA2)),
d.ColD2
FROM TabelaA AS a
LEFT JOIN TabelaC AS c ON a.ColA1 = c.ColC1
INNER JOIN TabelaB AS b ON b.ColB1 = a.ColA1
INNER JOIN TabelaD AS d ON d.ColD1 = a.ColA1
WHERE
    CASE
        WHEN @zm1 = 'mn' THEN a.ColA2 > c.ColC2  <-------tu podkreśla '>'
        WHEN @zm1 = 'wk' THEN a.ColA2 < c.ColC2   <-------tu 'WHEN'
    END                                                                                 <------- podkreśla również
ORDER BY a.A1                                                                <-------- Podkreśla "ORDER'

Incorrect syntax near '>'. dla pierwszego podkreślenia

komentarz 23 sierpnia 2019 przez Chess Szeryf (76,710 p.)

SQL Server CASE Syntax Nie wiem, czy to to, ale tam jest chyba wymagane podanie nawiasów dla wyrażenia. Musiałbyś doczytać, jeśli chodzi o różne niuansy w dokumentacji microsoft'u.

Spróbuj zatem tak

-- ...
CASE WHEN @zm1 = 'mn' THEN (a.ColA2 > c.ColC2)
-- ...
komentarz 23 sierpnia 2019 przez marcinconn Obywatel (1,560 p.)
dalej nic
komentarz 23 sierpnia 2019 przez Chess Szeryf (76,710 p.)
Zmień kodowanie pliku na UTF-8 bez BOM. Spróbuj napisać samo CASE WHEN bez tego SELECT na początku i sprawdź, czy pójdzie; oczywiście z nawiasami zgodnie z przykładem powyżej.

Ogólnie to uruchom te polecenie poprzez np. CMD Windows'a, a nie przez jakieś GUI, ponieważ być może masz coś w ustawieniach namieszane. Najprawdopodobniej musisz wejść na ścieżkę, która odpowiada za SQL Server, np. taką: .../bin. Do przechodzenia do kolejnych folderów można uzyć polecenia "CD". Przykład "CD C:/". Później napisz coś w tym stylu "mysql -u root -p". Po wpisaniu hasła i gdy wszystko się pomyślnie powiedzie, wybierz bazę i wpisz odpowiednie zapytanie.

Podobne pytania

0 głosów
1 odpowiedź 128 wizyt
0 głosów
0 odpowiedzi 74 wizyt
pytanie zadane 13 października 2016 w SQL, bazy danych przez pajos96 Obywatel (1,350 p.)
0 głosów
3 odpowiedzi 173 wizyt

92,757 zapytań

141,679 odpowiedzi

320,437 komentarzy

62,101 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...