Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: MSSQL - if jako funkcja?

Witam ponownie,
mam pytanko: czy składnia MSSQL przewiduje jakąś konstrukcję zbliżoną do poniższych:


result = (condition) ? val_when_true : val_when_false


result = if(condition, val_when_true, val_then_false)


Konkretnie potrzebuję tego przy update - chodzi mi o to, żeby w jednej z kolumn wpisywać różną wartość w zależności od tego, czy w tym samym update w innej kolumnie wartość nowa jest równa starej, czy nie.

Czyli coś takiego:


UPDATE mytable
SET field1 = 'X',
field2 = if(field1 = 'X', 'A', 'B')
WHERE ....


Chodzi o MSSQL 2008 - jeśli to istotne.
Doszukałem się, że można to zrobić za pomocą CASE, ale składnia tego jest wyjątkowo parszywa i potwornie mi się nie podoba :)

Da się?
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: MSSQL - if jako funkcja?

Piotr Głudkowski:
Chodzi o MSSQL 2008 - jeśli to istotne.
Doszukałem się, że można to zrobić za pomocą CASE, ale składnia tego jest wyjątkowo parszywa i potwornie mi się nie podoba :)

Dlaczego?


UPDATE mytable
SET field1 = 'X',
field2 = CASE field1
WHEN 'X' THEN ...
WHEN 'Y' THEN ..
END
WHERE..


albo


UPDATE mytable
SET field1 = 'X',
field2 = CASE
WHEN field1 in ('X','Y','Z') THEN ...
ELSE .....
END
WHERE..


Z IF nie byloby prosciej, tez trzeba sprawdzic warunek.. chyba ze nie zrozumialem pytania :)
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: MSSQL - if jako funkcja?

Bartosz Ślepowronski:

Z IF nie byloby prosciej, tez trzeba sprawdzic warunek.. chyba ze nie zrozumialem pytania :)

Chodziło mi nie tyle o IF, ale o jego odpowiednik składniowy, dający się stosować bezpośrednio w instrukcjach przypisania.

Bo ten CASE to jakoś mało ładnie wygląda :) Ta wersja z CASE-WHEN-THEN-ELSE-END (bo ona najbardziej pasuje mi funkcjonalnie) ma aż 5 słów kluczowych! Masakra.

Wiem - czepiam się. Skoro to działa, to w zasadzie nie ma różnicy.
Mam nadzieję, że MSSQL nie będzie się burzył, jeśli zapiszę coś takiego (z tym CASE) w jednej linijce? Żadnych tam ekstra średników nie trzeba dodawać?Piotr Głudkowski edytował(a) ten post dnia 28.07.10 o godzinie 19:50
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: MSSQL - if jako funkcja?

Piotr Głudkowski:
Bo ten CASE to jakoś mało ładnie wygląda :) Ta wersja z CASE-WHEN-THEN-ELSE-END (bo ona najbardziej pasuje mi funkcjonalnie) ma aż 5 słów kluczowych! Masakra.

Skladnia if nie jest wiele lepsza:
IF BEGIN COS_ZAMIAST_THEN END ELSE

Sorry :)
Mam nadzieję, że MSSQL nie będzie się burzył, jeśli zapiszę coś takiego (z tym CASE) w jednej linijce? Żadnych tam ekstra średników nie trzeba dodawać?

Na szczęście nie trzeba :)Bartosz Ślepowronski edytował(a) ten post dnia 28.07.10 o godzinie 20:51
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: MSSQL - if jako funkcja?

Bartosz Ślepowronski:
Piotr Głudkowski:
Bo ten CASE to jakoś mało ładnie wygląda :) Ta wersja z CASE-WHEN-THEN-ELSE-END (bo ona najbardziej pasuje mi funkcjonalnie) ma aż 5 słów kluczowych! Masakra.

Skladnia if nie jest wiele lepsza:
IF BEGIN COS_ZAMIAST_THEN END ELSE

No tak, ale jak by było podobnie, jak w funkcjach:

field2 = IF(field1 = 'X', 'A', 'B')

albo jak w C/C++/C# (i nie tylko)

field2 = (field1 = 'X') ? 'A' : 'B'

to by było naprawdę pięknie :)

Tak czy inaczej dzięki za przykład z tym ELSE - bo właśnie o to mi chodziło.

konto usunięte

Temat: MSSQL - if jako funkcja?

Piotr Głudkowski:
No tak, ale jak by było podobnie, jak w funkcjach:

field2 = IF(field1 = 'X', 'A', 'B')

albo jak w C/C++/C# (i nie tylko)

field2 = (field1 = 'X') ? 'A' : 'B'

to by było naprawdę pięknie :)

Tak czy inaczej dzięki za przykład z tym ELSE - bo właśnie o to mi chodziło.

jest funkcja ISNULL i NULLIF
nie jest to co prawda do kó♦ńca to co pisałeś, ale często się przydaje, zwłaszcza pierwsza funkcja
Marcin Pigłowski

Marcin Pigłowski Specjalista ds. baz
danych

Temat: MSSQL - if jako funkcja?

Piotr Głudkowski:

Bo ten CASE to jakoś mało ładnie wygląda :) Ta wersja z CASE-WHEN-THEN-ELSE-END (bo ona najbardziej pasuje mi funkcjonalnie) ma aż 5 słów kluczowych! Masakra.

To nie ma wyglądać tylko działać!!! a jak robisz odpowiednie wcięcia i formatujesz porządnie kod to i ładnie wygląd.

Możesz sobie napisać funkcje, która będzie sprawdzała warunek i zwracała odpowiednią wartość.
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: MSSQL - if jako funkcja?

Marcin Pigłowski:
Piotr Głudkowski:

Bo ten CASE to jakoś mało ładnie wygląda :) Ta wersja z CASE-WHEN-THEN-ELSE-END (bo ona najbardziej pasuje mi funkcjonalnie) ma aż 5 słów kluczowych! Masakra.

To nie ma wyglądać tylko działać!!! a jak robisz odpowiednie wcięcia i formatujesz porządnie kod to i ładnie wygląd.

Jak bym pisał tylko dla siebie, może bym się tym nie przejmował. Ale to się musi potem dać sprawnie serwisować- a więc musi działać i musi wyglądać :)

Możesz sobie napisać funkcje, która będzie sprawdzała warunek i zwracała odpowiednią wartość.
Tyle, że funkcje wydajnościowo słabo wyglądają :(

konto usunięte

Temat: MSSQL - if jako funkcja?

Piotr Głudkowski:

Możesz sobie napisać funkcje, która będzie sprawdzała warunek i zwracała odpowiednią wartość.
Tyle, że funkcje wydajnościowo słabo wyglądają :(

funkcje skalarne - pierwsze słyszę
przecież w nich enkapsulujesz tylko kawałek T-SQL-a - przy założeniu oczywiście że nie robisz jakiegoś selecta w środku, wtedy taka funkcja jest de facto ukrytym kursoerm
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: MSSQL - if jako funkcja?

Funkcje zawsze wnoszą narzut związany z wywołaniem, poza tym czasem potrafią dać popalić optymalizatorowi :)
No i, jak by już chcieć mieć taką funkcję, to fajnie by było, jakby działała z różnymi typami argumentów. A przeciążanie w MSSQL nadal nie jest dostępne - a nawet jakby było, to nie przypuszczam, żeby było naprawdę wydajne.

konto usunięte

Temat: MSSQL - if jako funkcja?

konstrukcja z wykorzystaniem jakiś gadżetów psują tak samo, nie bez powodu nie stosuje sie tego typu rozwiązań po lewej stronie warunku where
Marcin Pigłowski

Marcin Pigłowski Specjalista ds. baz
danych

Temat: MSSQL - if jako funkcja?

Piotr Głudkowski:

Jak bym pisał tylko dla siebie, może bym się tym nie przejmował. Ale to się musi potem dać sprawnie serwisować- a więc musi działać i musi wyglądać :)

Konstrukcja CASE WHEN THEN ELSE END z tego co wiem działa, więc już jeden warunek mamy spełniony, a co do wyglądu jak mówiłem odpowiednie wcięcia i będzie wygląd. Sam pracuję w utrzymaniu systemów i jak weryfikowałem procedurę która miała blisko 20000 linii kodu to jakoś się nie przejmowałem tym, że CASE WHEN THEN ELSE END to 5 słów kluczowych. Warunek: musi być ładnie sformatowane.

Trochę mi się wydaje, że kolega szuka dziury w całym.Marcin Pigłowski edytował(a) ten post dnia 09.08.10 o godzinie 16:09
Remigiusz Cieślak

Remigiusz Cieślak Software Developer

Temat: MSSQL - if jako funkcja?

Piotr Głudkowski:
Funkcje zawsze wnoszą narzut związany z wywołaniem, poza tym czasem potrafią dać popalić optymalizatorowi :)
Dają popalić głównie w sytuacjach, gdy są to funkcje niedeterministyczne. Opisana tutaj funkcja byłaby deterministyczna, ponieważ nie odwołuje się do żadnych zewnętrznych obiektów oraz zawsze dla ustalonego zbioru parametrów wejściowych będzie zwracać ten sam wynik. Czy funkcja została zakwalifikowana jako deterministyczna, można łatwo sprawdzić dodając taką funkcję, a następnie uruchamiając zapytanie SELECT SPECIFIC_NAME, SPECIFIC_SCHEMA, IS_DETERMINISTIC FROM INFORMATION_SCHEMA.ROUTINES.
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: MSSQL - if jako funkcja?

Marcin Pigłowski:
/.../ jak weryfikowałem procedurę która miała blisko 20000 linii kodu
W jednej procedurze???? 20000 linii kodu???? Mówisz oczywiście o procedurze składowanej????
Warunek: musi być ładnie sformatowane.
Podpisuję się pod tym obydwoma łapkami. Sformatowanie - nawet jeśli nie jest zgodne z naszym sposobem formatowania, ale konsekwentne - drastycznie poprawia "ogarnialność" kodu przez programistę
Trochę mi się wydaje, że kolega szuka dziury w całym.
Trochę tak :)
Za dużo mam przyzwyczajeń z innych języków i ten CASE w takiej postaci po prostu mi nie pasi :)



Wyślij zaproszenie do