Kombinacja CASE..WHEN z IF

Kombinacja CASE..WHEN z IF
BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0

Muszę procedurę zwracającą wyniki przerobić na zwykłe zapytanie. W procedurze sprawdzane są wartości parametrów przy pomocy IF. Co więcej, zapytanie musi zaczynać się od SELECT. Mniej więcej procedura wygląda tak:

Kopiuj
IF @par1 = 0
BEGIN
  IF @par2 = @par3
  BEGIN
    SELECT lista_pol FROM tabele WHERE warunki
  END
  ELSE
  BEGIN
    SELECT lista_pol FROM tabele WHERE inne_warunki
  END
ELSE
BEGIN
  Dalsza część kodu
END

Zacząłem kombinować tak:

Kopiuj
SELECT
  CASE WHEN @par1 = 0 THEN
    IF @par2 = @par3
    BEGIN
      SELECT lista_pol FROM tabele WHERE warunki
    END
    ELSE
    BEGIN
      SELECT lista_pol FROM tabele WHERE inne_warunki
    END
  ELSE
    Dalsza część kodu
  END  

Niestety, SSMS podkreśla mi IF, że tam jest błąd. Z resztą po uruchomieniu zapytania, wskazuje, że tam jest zła składnia.
Jak to po ludzku ogarnąć? Podpowie jakaś dobra duszyczka?

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3580
0

Zwykłe zapytanie? To skąd mają się w nim wziąć parametry?

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
1

Masz IF w IF'ie więc w select musisz użyć case w case 😀

BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0
woolfik napisał(a):

Masz IF w IF'ie więc w select musisz użyć case w case 😀

A podpowiesz jak, bo coś mi nie idzie.

AC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 83
1

A nie lepiej wrzucić te warunki do where jak chcesz to mieć w selecie?

Kopiuj
select lista pol
from tabela 
where
  case par 1 = 0 and par2= par3 then
    case when (warunek) then 1 else 0 end
  when @par1 = 0 and @par2 <> @par3 then 
         case when (inne_warunki) then 1 ELSE 0 END
 else
         case when (dalsze_warunki) then 1 else 0 END
end = 1 
hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 734
1
Kopiuj
SELECT 
    CASE 
        WHEN @par1 = 0 AND @par2 = @par3 THEN lista_pol
        WHEN @par1 = 0 AND @par2 <> @par3 THEN lista_pol
        ELSE NULL -- Jeżeli nie spełnia żadnego z warunków
    END AS wynik_1,
    
    -- Dalsza część kodu, która zostanie wykonana, jeśli @par1 nie będzie równe 0.
    CASE 
        WHEN @par1 <> 0 THEN dalsza_czesc_kodu
        ELSE NULL
    END AS wynik_2
FROM tabele
WHERE 
    ( @par1 = 0 AND @par2 = @par3 AND warunki ) 
    OR ( @par1 = 0 AND @par2 <> @par3 AND inne_warunki )
    OR ( @par1 <> 0 AND dalsza_czesc_warunkow )

BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0

@hzmzp Zrobiłem tak jak napisałeś. Ale mam błąd składniowy, zaraz po pierwszym THEN, po pierwszym polu.
Wklejam całe zapytanie.

Kopiuj
SELECT
	CASE 
		WHEN @par1 = 0 AND @par2 = @par3 THEN 
			t1.pole1, t1.pole2, t1.pole3, CASE WHEN t1.pole4 = 5 THEN 'BO' ELSE t2.pole1 END AS polex, 
			t1.pole5, t2.pole2, t3.pole1, 
			CASE t2.pole3
				WHEN 1 THEN ISNULL(widok.pole1, 'Grupa kont') 	
				WHEN 0 THEN  'dekret M do N' 
				ELSE 'BO' 
			END AS poley, 
			t4.pole1, t4.pole2, t2.pole4, t1.pole6, 
			CASE WHEN t1.pole4 = 5 THEN 'Bilans otwarcia' ELSE t1.pole7 END AS polez
		WHEN @par1 = 0 AND @par2 <> @par3 THEN
			t1.pole1, t1.pole2, t1.pole3, CASE WHEN t1.pole4 = 5 THEN 'BO' ELSE t2.pole1 END AS polex, 
			t1.pole5, t2.pole2, t3.pole1, 
			CASE t2.pole3
				WHEN 1 THEN ISNULL(widok.pole1, 'Grupa kont') 	
				WHEN 0 THEN  'dekret M do N' 
				ELSE 'BO' 
			END AS poley, 
			t4.pole1, t4.pole2, t2.pole4, t1.pole6, 
			CASE WHEN t1.pole4 = 5 THEN 'Bilans otwarcia' ELSE t1.pole7 END AS polez
		ELSE ''
	END AS Result
FROM t1
	LEFT JOIN t2 ON t2.t1id = t1.id
	LEFT JOIN widok ON t1.id = widok.t1IdZapisu
	LEFT JOIN t5 ON t5.id=t2.t5id
	LEFT JOIN t6 ON t2.t6id = t6.id
	LEFT JOIN t4 ON t6.id = t4.t6Id AND t4.pole10 = 1
	LEFT JOIN t3 ON t2.id = t3.t2id
WHERE 
	(@par1 = 0 AND @par2 = @pa3 AND t1.pole8 = @par4 AND t1.pole5 BETWEEN @par5 AND @par6  AND t1.pole3 LIKE @par2
	AND ((t1.pole4 = @par7 OR t1.pole4 = 5) OR @par7 = 0 )	
	AND (t2.t5id = @par8 OR  @par8 = '%' OR t1.pole4 = 5)
	AND (@par9 = '' OR t1.pole4=5 OR t5.id IN(SELECT id FROM dbo.funkcja(@par9))))

ORDER BY t1.pole5,t1.pole3

Nie zwracamy uwagi, że parametry są bez wartości. Będą odpowiednio wstawione.

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 215
0
Buster napisał(a):

@hzmzp Zrobiłem tak jak napisałeś. Ale mam błąd składniowy, zaraz po pierwszym THEN, po pierwszym polu.
Wklejam całe zapytanie.

Kopiuj
SELECT
	CASE 
		WHEN @par1 = 0 AND @par2 = @par3 THEN 
			t1.pole1, t1.pole2, t1.pole3, CASE WHEN t1.pole4 = 5 THEN 'BO' ELSE t2.pole1 END AS polex, 

Nie zakończyłeś CASE'a

Zadziałałoby poniższe:

Kopiuj
SELECT
  CASE WHEN @par1 = 0 AND @par2 = @par3 THEN t1.pole1 ELSE NULL END,
  t1.pole2, t1.pole3, CASE WHEN t1.pole4 = 5 THEN 'BO' ELSE t2.pole1 END AS polex, 
BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0
Fac napisał(a):
Buster napisał(a):

@hzmzp Zrobiłem tak jak napisałeś. Ale mam błąd składniowy, zaraz po pierwszym THEN, po pierwszym polu.
Wklejam całe zapytanie.

Kopiuj
SELECT
	CASE 
		WHEN @par1 = 0 AND @par2 = @par3 THEN 
			t1.pole1, t1.pole2, t1.pole3, CASE WHEN t1.pole4 = 5 THEN 'BO' ELSE t2.pole1 END AS polex, 

Nie zakończyłeś CASE'a

Zadziałałoby poniższe:

Kopiuj
SELECT
  CASE WHEN @par1 = 0 AND @par2 = @par3 THEN t1.pole1 ELSE NULL END,
  t1.pole2, t1.pole3, CASE WHEN t1.pole4 = 5 THEN 'BO' ELSE t2.pole1 END AS polex, 

Ale ja chcę mieć kilka wartości z pól gdy @par1 = 0 i @par2 = @par3

hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 734
0

To po prostu weź całe zapytanie które masz i działa (to na if) wsadź do chatgpt i każ mu zrobić to na case'ach.

BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0

Heh. Widzę, że ChatGPT rulez 😁

Niestety ChatGPT poległ. Przedstawił mi różne wersje, a i tak żadna nie działa. Błędy składniowe. Chyba zbyt skomplikowane dla niego.

LB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 75
0
Buster napisał(a):

@hzmzp Zrobiłem tak jak napisałeś. Ale mam błąd składniowy, zaraz po pierwszym THEN, po pierwszym polu.
Wklejam całe zapytanie.

Kopiuj
SELECT
	CASE 
		WHEN @par1 = 0 AND @par2 = @par3 THEN 
			t1.pole1, t1.pole2, t1.pole3, CASE WHEN t1.pole4 = 5 THEN 'BO' ELSE t2.pole1 END AS polex, 
			t1.pole5, t2.pole2, t3.pole1, 
			CASE t2.pole3
				WHEN 1 THEN ISNULL(widok.pole1, 'Grupa kont') 	
				WHEN 0 THEN  'dekret M do N' 
				ELSE 'BO' 
			END AS poley, 
			t4.pole1, t4.pole2, t2.pole4, t1.pole6, 
			CASE WHEN t1.pole4 = 5 THEN 'Bilans otwarcia' ELSE t1.pole7 END AS polez
		WHEN @par1 = 0 AND @par2 <> @par3 THEN
			t1.pole1, t1.pole2, t1.pole3, CASE WHEN t1.pole4 = 5 THEN 'BO' ELSE t2.pole1 END AS polex, 
			t1.pole5, t2.pole2, t3.pole1, 
			CASE t2.pole3
				WHEN 1 THEN ISNULL(widok.pole1, 'Grupa kont') 	
				WHEN 0 THEN  'dekret M do N' 
				ELSE 'BO' 
			END AS poley, 
			t4.pole1, t4.pole2, t2.pole4, t1.pole6, 
			CASE WHEN t1.pole4 = 5 THEN 'Bilans otwarcia' ELSE t1.pole7 END AS polez
		ELSE ''
	END AS Result

To trochę bez sensu, wersja dla par2=par3 jest chyba taka sama, jak par2<>par3

Buster napisał(a):

Muszę procedurę zwracającą wyniki przerobić na zwykłe zapytanie.

Nie wiem, czy MSSQL ma jakoś rozbudowanego case, ale o ile kojarzę, to standardowy case ze specyfikacji SQL zwraca jedną wartość.
Raczej coś w stylu:

Kopiuj
 SELECT
	pole1_niezalezne_od_par2_rowne_par3, 
    pole2_niezalezne_od_par2_rowne_par3, 
    pole3_niezalezne_od_par2_rowne_par3,
    case when @par2 = @par3 then costam1 else costam_innego1 end as bla,
    case when @par2 = @par3 then costam2 else costam_innego2 end as bla2,
    case when @par2 = @par3 then costam3 else costam_innego3 end as bla3
from 
   pojoinowane_tabelki
where @par0 = 0 and (lista_Twoich_warunkow);

Druga wersja to lecisz wersją

Kopiuj
select to_co_chcesz
from tabelki
where @par0 = 0 and @par2 = @par3 and lista_warunkow
union all
select to_co_chcesz
from tabelki
where @par0 = 0 and @par2 <> @par3 and lista_warunkow

Czyli coś typu

Kopiuj
 SELECT
	pole1_niezalezne_od_par2_rowne_par3, 
    pole2_niezalezne_od_par2_rowne_par3, 
    pole3_niezalezne_od_par2_rowne_par3,
    costam1 as bla,
    costam2 as bla2,
    costam3 as bla3
from 
   pojoinowane_tabelki
where @par0 = 0 and @par2 = @par3 and (lista_Twoich_warunkow)

union all
 SELECT
	pole1_niezalezne_od_par2_rowne_par3, 
    pole2_niezalezne_od_par2_rowne_par3, 
    pole3_niezalezne_od_par2_rowne_par3,
    costam_innego1 as bla,
    costam_innego2 as bla2,
    costam_innego3 as bla3
from 
   pojoinowane_tabelki
where @par0 = 0 and @par2 <> @par3 and (lista_Twoich_warunkow)
BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0

@Los Bomberos Generalnie w przypadku @par2 i @par3 masz rację. Są te same pola. Ale jak temat ugryźć, gdy w grę wchodzi zróżnicowanie @par1. Ten parametr będzie przyjmował wartość 0 lub 1. Tam jeszcze dochodzi kwestia tabeli tymczasowej. Sorki, nie załączyłem wcześniej całości. Już to nadrabiam. Załączam całą procedurę, którą chciałbym przerobić na zwykłe zapytanie. Nie zmieniam danych pól, bo zbyt dużo tego. O ile dla pierwszej części jest ok, czyli w sumie działa, o tyle w tym momencie nie mam jakiegoś pojęcia, jak dorzucić drugą część, gdy parametr @rozbicie != 0. Tam dochodzi tabela tymczasowa.

Kopiuj
IF @Rozbicie  = 0 
BEGIN
	IF @kontoOd = @kontoDo 
	BEGIN
		SELECT dko_KwotaMa, dko_KwotaWn, dko_Konto, CASE WHEN dko_Status = 5 THEN 'BO' ELSE dkr_NrPelny END AS dkr_NrPelny, 
		dko_DataDekretacji, dkr_DokumentZrodlowy, pwd_Tekst01, 
		CASE dkr_KontrolaBilansowania
			WHEN 1 THEN ISNULL(vwKontaPrzeciwstawne.Przeciwstawne, 'Grupa kont') 	
			WHEN 0 THEN  'dekret M do N' 
			ELSE 'BO' 
		END AS Przeciwstawne, 
		adr_NazwaPelna, adr_NIP, dkr_DataDokumentu, dko_LpWiersza, 
		CASE WHEN dko_Status = 5 THEN 'Bilans otwarcia' ELSE dko_Opis END AS dko_Opis
		FROM dbo.dkr_Pozycja
			LEFT JOIN dkr__Dokument ON dko_IdDokumentu = dkr_Id
			LEFT JOIN vwKontaPrzeciwstawne ON dko_ID = IdZapisu
			LEFT JOIN sl_RejestrKsiegowy ON rks_Symbol=dkr_Rejestr
			LEFT JOIN kh__Kontrahent ON dkr_IdKh = kh_Id
			LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu AND adr_TypAdresu = 1
			LEFT JOIN pw_Dane ON dkr_Id = pwd_IdObiektu
		WHERE dko_IdRoku = @IdRoku AND dko_DataDekretacji BETWEEN @DataOd AND @DataDo  AND dko_Konto LIKE @kontoOd
			AND ((dko_Status = @Status OR dko_Status = 5) OR @Status = 0 )	
			AND (dkr_Rejestr = @Rejestr OR  @Rejestr = '%' OR dko_Status = 5)
			AND (@IdyRejestrow = '' OR dko_Status=5 OR rks_Id IN(SELECT id FROM dbo.fnTabelaIdow(@IdyRejestrow)))
		ORDER BY dko_DataDekretacji,dko_Konto
	END
	ELSE
	BEGIN
		SELECT dko_KwotaMa, dko_KwotaWn, dko_Konto, CASE WHEN dko_Status = 5 THEN 'BO' ELSE dkr_NrPelny END AS dkr_NrPelny, 
		dko_DataDekretacji, dkr_DokumentZrodlowy, pwd_Tekst01, 
		CASE dkr_KontrolaBilansowania
			WHEN 1 THEN ISNULL(vwKontaPrzeciwstawne.Przeciwstawne, 'Grupa kont') 	
			WHEN 0 THEN  'dekret M do N' 
			ELSE 'BO' 
		END AS Przeciwstawne, 
		adr_NazwaPelna, adr_NIP, dkr_DataDokumentu, dko_LpWiersza, 
		CASE WHEN dko_Status = 5 THEN 'Bilans otwarcia' ELSE dko_Opis END AS dko_Opis
		FROM dbo.dkr_Pozycja
			LEFT JOIN dkr__Dokument ON dko_IdDokumentu = dkr_Id
			LEFT JOIN vwKontaPrzeciwstawne ON dko_ID = IdZapisu
			LEFT JOIN sl_RejestrKsiegowy ON rks_Symbol=dkr_Rejestr
			LEFT JOIN kh__Kontrahent ON dkr_IdKh = kh_Id
			LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu AND adr_TypAdresu = 1
			LEFT JOIN pw_Dane ON dkr_Id = pwd_IdObiektu
		WHERE dko_IdRoku = @IdRoku AND dko_DataDekretacji BETWEEN @DataOd AND @DataDo  
			AND ((dko_Konto BETWEEN @kontoOd AND @kontoDo) OR (dko_Konto LIKE @KontoOd OR dko_Konto LIKE @KontoDo) )
			AND ((dko_Status = @Status OR dko_Status = 5) OR @Status = 0 )	
			AND (dkr_Rejestr = @Rejestr OR  @Rejestr = '%' OR dko_Status = 5)
			AND (@IdyRejestrow = '' OR dko_Status=5 OR rks_Id IN(SELECT id FROM dbo.fnTabelaIdow(@IdyRejestrow)))
		ORDER BY dko_DataDekretacji,dko_Konto
	END
END

ELSE
BEGIN
		SELECT dko_Id, dko_KwotaMa, dko_KwotaWn, dko_Konto, CASE WHEN dko_Status = 5 THEN 'BO' ELSE dkr_NrPelny END AS dkr_NrPelny, 
		dko_DataDekretacji, dkr_DokumentZrodlowy, pwd_Tekst01, 
		CASE dkr_KontrolaBilansowania
			WHEN 1 THEN ISNULL(vwKontaPrzeciwstawne.Przeciwstawne, 'Grupa kont') 	
			WHEN 0 THEN  'dekret M do N' 
			ELSE 'BO' 
		END AS Przeciwstawne, 
		adr_NazwaPelna, adr_NIP, dkr_DataDokumentu, dko_LpWiersza, dkr_Id, dko_Grupa,
		CASE WHEN dko_Status = 5 THEN 'Bilans otwarcia' ELSE dko_Opis END AS dko_Opis
		INTO #TMP_ZAPISY FROM dbo.dkr_Pozycja
			LEFT JOIN dkr__Dokument ON dko_IdDokumentu = dkr_Id
			LEFT JOIN vwKontaPrzeciwstawne ON dko_ID = IdZapisu
			LEFT JOIN sl_RejestrKsiegowy ON rks_Symbol=dkr_Rejestr
			LEFT JOIN kh__Kontrahent ON dkr_IdKh = kh_Id
			LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu AND adr_TypAdresu = 1
			LEFT JOIN pw_Dane ON dkr_Id = pwd_IdObiektu
		WHERE dko_IdRoku = @IdRoku AND dko_DataDekretacji BETWEEN @DataOd AND @DataDo  
			AND ((dko_Status = @Status OR dko_Status = 5) OR @Status = 0 )	
			AND (dkr_Rejestr = @Rejestr OR  @Rejestr = '%' OR dko_Status = 5)
			AND (@IdyRejestrow = '' OR dko_Status=5 OR rks_Id IN(SELECT id FROM dbo.fnTabelaIdow(@IdyRejestrow)))
		ORDER BY dko_DataDekretacji,dko_Konto;
	
	
	IF @kontoOd = @kontoDo 
	BEGIN
		SELECT * FROM (
		SELECT 
			CASE Przeciwstawne WHEN 'Dekret M do N' THEN dko_KwotaMa WHEN 'BO' THEN dko_KwotaMa ELSE dko_KwotaWn END AS dko_KwotaMa,
			CASE Przeciwstawne WHEN 'Dekret M do N' THEN dko_KwotaWn WHEN 'BO' THEN dko_KwotaWn ELSE dko_KwotaMa END AS dko_KwotaWn, 
			CASE Przeciwstawne WHEN 'Dekret M do N' THEN dko_Konto WHEN 'BO' THEN dko_Konto ELSE Przeciwstawne END AS dko_Konto, 
			dkr_NrPelny, dko_DataDekretacji, dkr_DokumentZrodlowy, pwd_Tekst01, 
			CASE Przeciwstawne WHEN 'Dekret M do N' THEN Przeciwstawne WHEN 'BO' THEN Przeciwstawne ELSE dko_Konto END AS Przeciwstawne,
			adr_NazwaPelna, adr_NIP, dkr_DataDokumentu, dko_LpWiersza, dko_Opis
			--,dko_Id, dkr_Id
			FROM #TMP_ZAPISY
			WHERE Przeciwstawne LIKE @kontoOd 
			OR
				(dko_Konto LIKE @kontoOd AND (Przeciwstawne = 'dekret M do N' OR Przeciwstawne = 'BO' ) )
			
			UNION ALL

			SELECT dko_KwotaMa, dko_KwotaWn, dko_Konto, dkr_NrPelny, dko_DataDekretacji, dkr_DokumentZrodlowy, pwd_Tekst01, Przeciwstawne, adr_NazwaPelna, adr_NIP, 
				dkr_DataDokumentu, dko_LpWiersza, dko_Opis--, dko_Id, dkr_Id			
			FROM #TMP_ZAPISY AS GL
			WHERE 
				(dko_Konto LIKE @kontoOd AND (Przeciwstawne != 'Grupa kont' AND Przeciwstawne != 'dekret M do N' AND Przeciwstawne != 'BO' )
				)
			AND
				not exists(
				SELECT dko_id FROM #TMP_ZAPISY as Pom WHERE (Przeciwstawne LIKE @kontoOd OR (dko_Konto LIKE @kontoOd AND (Przeciwstawne = 'dekret M do N' OR Przeciwstawne = 'BO' )))
				and Pom.dko_Grupa = GL.dko_Grupa AND Pom.dkr_Id=GL.dkr_Id )
				) AS ZAPISY
		ORDER BY dko_DataDekretacji, dko_Konto, dkr_NrPelny;
	END
	ELSE
	BEGIN
		SELECT * FROM (
		SELECT 
			CASE Przeciwstawne WHEN 'Dekret M do N' THEN dko_KwotaMa WHEN 'BO' THEN dko_KwotaMa ELSE dko_KwotaWn END AS dko_KwotaMa,
			CASE Przeciwstawne WHEN 'Dekret M do N' THEN dko_KwotaWn WHEN 'BO' THEN dko_KwotaWn ELSE dko_KwotaMa END AS dko_KwotaWn, 
			CASE Przeciwstawne WHEN 'Dekret M do N' THEN dko_Konto WHEN 'BO' THEN dko_Konto ELSE Przeciwstawne END AS dko_Konto, 
			dkr_NrPelny, dko_DataDekretacji, dkr_DokumentZrodlowy, pwd_Tekst01, 
			CASE Przeciwstawne WHEN 'Dekret M do N' THEN Przeciwstawne WHEN 'BO' THEN Przeciwstawne ELSE dko_Konto END AS Przeciwstawne,
			adr_NazwaPelna, adr_NIP, dkr_DataDokumentu, dko_LpWiersza, dko_Opis
			--,dko_Id, dkr_Id
			FROM #TMP_ZAPISY
			WHERE ((Przeciwstawne BETWEEN @kontoOd AND @kontoDo) OR (Przeciwstawne LIKE @KontoOd OR Przeciwstawne LIKE @KontoDo))
				OR (((dko_Konto BETWEEN @kontoOd AND @kontoDo) OR (dko_Konto LIKE @KontoOd OR dko_Konto LIKE @KontoDo) )
				AND (Przeciwstawne = 'dekret M do N' OR Przeciwstawne = 'BO' ))
			
			UNION ALL

			SELECT dko_KwotaMa, dko_KwotaWn, dko_Konto, dkr_NrPelny, dko_DataDekretacji, dkr_DokumentZrodlowy, pwd_Tekst01, Przeciwstawne, adr_NazwaPelna, adr_NIP, 
				dkr_DataDokumentu, dko_LpWiersza, dko_Opis--, dko_Id, dkr_Id			
			FROM #TMP_ZAPISY AS GL
			WHERE 
				((dko_Konto BETWEEN @kontoOd AND @kontoDo) AND (Przeciwstawne != 'Grupa kont' AND Przeciwstawne != 'dekret M do N' AND Przeciwstawne != 'BO' )
				)
			AND
				not exists(
				SELECT dko_id FROM #TMP_ZAPISY as Pom WHERE (((Przeciwstawne BETWEEN @kontoOd AND @kontoDo) OR (Przeciwstawne LIKE @KontoOd OR Przeciwstawne LIKE @KontoDo))
				OR ((dko_Konto BETWEEN @kontoOd AND @kontoDo) AND (Przeciwstawne = 'dekret M do N' OR Przeciwstawne = 'BO' )))
				and Pom.dko_Grupa = GL.dko_Grupa AND Pom.dkr_Id=GL.dkr_Id )
				) AS ZAPISY
		ORDER BY dko_DataDekretacji, dko_Konto, dkr_NrPelny;
	END
END
LB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 75
0
Buster napisał(a):

@Los Bomberos Generalnie w przypadku @par2 i @par3 masz rację. Są te same pola. Ale jak temat ugryźć, gdy w grę wchodzi zróżnicowanie @par1.

No to skoro masz logikę podzieloną na 4 przypadki, to podziel selecta na 4 przypadki:

Kopiuj
select to_co_chcesz
from tabelki
where @par0 = 0 and @par2 = @par3 and lista_warunkow
union all
select to_co_chcesz
from tabelki
where @par0 = 0 and @par2 <> @par3 and lista_warunkow
union all
select to_co_chcesz
from tabelki
where @par0 <> 0 and @par2 = @par3 and lista_warunkow
union all
select to_co_chcesz
from tabelki
where @par0 <> 0 and @par2 <> @par3 and lista_warunkow

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.