Kombinacja CASE..WHEN z IF

Kombinacja CASE..WHEN z IF
BU
  • Rejestracja:ponad 22 lata
  • Ostatnio:minuta
  • Postów:296
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?


Pozdrawiam
Buster
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 14 godzin
  • Postów:3454
0

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

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 3 godziny
  • Postów:1595
1

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

BU
  • Rejestracja:ponad 22 lata
  • Ostatnio:minuta
  • Postów:296
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.


Pozdrawiam
Buster
woolfik
Sorki dopiero teraz odczytałem chyba poniżej już ci ekipa odpowiedziała jak :D
AC
  • Rejestracja:3 miesiące
  • Ostatnio:dzień
  • Postów:27
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 
edytowany 3x, ostatnio: cerrato
hzmzp
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 12 godzin
  • Postów:618
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:ponad 22 lata
  • Ostatnio:minuta
  • Postów:296
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.


Pozdrawiam
Buster
FA
  • Rejestracja:prawie 5 lat
  • Ostatnio:dzień
  • Postów:175
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, 

Chciałbym kiedyś wiedzieć tyle, by spełniać wymagania na moim obecnym stanowisku :)
BU
  • Rejestracja:ponad 22 lata
  • Ostatnio:minuta
  • Postów:296
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


Pozdrawiam
Buster
hzmzp
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 12 godzin
  • Postów:618
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:ponad 22 lata
  • Ostatnio:minuta
  • Postów:296
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.


Pozdrawiam
Buster
edytowany 1x, ostatnio: cerrato
hzmzp
A po co komplikować sobie życie?
LB
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 dni
  • Postów:74
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)
edytowany 3x, ostatnio: Los Bomberos
BU
  • Rejestracja:ponad 22 lata
  • Ostatnio:minuta
  • Postów:296
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

Pozdrawiam
Buster
LB
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 dni
  • Postów:74
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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)