Wybieranie maksymalnej wartości pod warunkiem, że w kolumnie nie ma NULLa

0

Używam bazy MySQL. Mam taki fragment tabeli:

 
id	value1	value2
"1"	"117.50"	"90.50"
"2"	"91.00"	"111.00"
"3"	"<NULL>"	"120.00"

Zapytanie:
SELECT max(value1), max(value2) FROM tabela;
zwróci mi: 117.50 120.00
Potrzebuję poprawić to zapytanie tak, aby w pierwszej kolumnie wynikiem było NULL. Czyli ma zwracać wartość maksymalną, jeżeli żadna wartość w kolumnie nie jest NULLem, a jeżeli któraś jest równa NULL, to ma nie szukać maksymalnej, tylko zwrócić NULL. Nie mam pomysłu jak to zrobić. Będę wdzięczny za wszelkie sugestie.

0

Spróbuj tak:

select 
    case max(case when value1 is null then 1 end) when 1 then null else max( value1) end max_val_1,
    case max(case when value2 is null then 1 end) when 1 then null else max( value2) end max_val_2
 from t
 

ewentualnie tak, wersja prawdopodobnie szybsza

select case when v1_null > 0 then null else max_val_1 end max_val_1,
       case when v2_null > 0 then null else max_val_1 end max_val_2
from ( 
	select max(case when value1 is null then 1 end) v1_null,  max( value1) max_val_1,
       	   max(case when value2 is null then 1 end) v2_null,  max( value2) max_val_2
	from t
) as x
0

Dzięki wielkie za pomoc. Sprawdziłem pierwsze rozwiązanie i wydaje mi się, że działa. Główną rzeczą, co się dowiedziałem, to jest to, że jest coś takiego jak konstrukcje CASE WHEN... Uzbrojony w tą wiedzę napisałem:

SELECT CASE WHEN (count(*)=count(value1)) THEN max(value1) ELSE NULL END AS value1x, CASE WHEN (count(*)=count(value2)) THEN max(value2) ELSE NULL END AS value2x FROM tabela;
 

Czy takie zapytanie jest gorsze? Pytam dlatego, że to jestem w stanie ogarnąć czemu zwraca wynik taki jak bym chciał :)

0
chodnik napisał(a)

Czy takie zapytanie jest gorsze? Pytam dlatego, że to jestem w stanie ogarnąć czemu zwraca wynik taki jak bym chciał :)

Czy gorsze ? Jak szybkość cię satysfakcjonuje, to jest OK.
Jak tabela ma bardzo dużo danych, to przede wszystkim trzeba sprawdzić execution plan,
czy przypadkiem zapytanie nie robi więcej niż jednego full table scana (jeden FTS musi, bo zlicza po całej tabeli)

  • czasem optymalizator może robić psikusy ;)
    A jak szybkość jest niesatysfakcjonująca, to warto przetestować różne wersje i zobaczyć która lepiej działa,
    albo pokombinować ze strukturą tabeli (indeksy) żeby ewentualnie coś przyspieszyć.
0

Pytam teoretycznie i na przyszłość. Moja tabela będzie zawierała cenniki wysyłki, więc zakładam, że będzie ich góra 10, w każdym kilka takich kolumn (w przykładzie podałem dwie). Dodatkowo będzie jeszcze WHERE, który ograniczy liczbę wierszy do cenników przypisanych do wybranych produktów. Tak więc co do czasu wykonania w moim konkretnym przypadku, to obaw nie mam, będzie szybko, bo mam mało danych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1