Mam kwerendę mysql, który używa bit_or na zestaw wyników. Gdy nie ma zestawu wyników, funkcja bit_or zwraca 0 (jest to poprawne zgodnie z dokumentacją mysql).
Na przykład:
select n from t1 where a=1;
Zwraca żadnych wierszy.
select bit_or(n) from t1 where a=1;
Zwraca 0
Potrzebuję wymusić ostatnie zapytanie, aby zamiast tego nie zwracać wyniku z zapytania bit_or, np. (w pseudokodzie, ponieważ nie znam prawidłowego wywołania):
select bit_or(n) unless 0 from t1 where a=1;
Czy ktoś wie, jak mogę to zrobić? (Wyjaśnienie, potrzebuję wartości zwrotnej "brak wyniku na 0" dla zewnętrznego programu, którego niestety nie można zmienić).
Odpowiedzi:
3 dla odpowiedzi № 1Możesz użyć a case
oświadczenie do null
z rzędu, tak jak poniżej:
select
case
when bit_or(n) = 0 then null
else bit_or(n)
end
from
t1
where
a=1
Lub, jeśli chcesz całkowicie zignorować wiersz, możesz to zrobić w having
klauzula:
select
bit_or(n)
from
t1
where
a=1
having
bit_or(n) <> 0
The having
Klauzula służy zasadniczo do wykonania where
na kolumnach zbiorczych (takich jak sum
lub max
). W takim przypadku Twoja kolumna agregująca ma wartość bit_or
. Jeśli masz dodatkowe kolumny w zestawie wyników, musisz je uwzględnić w group by
oświadczenie po where
Klauzula, ale przed having
klauzula.
Pierwszy przykład powróci null
dla tego rzędu, podczas gdy drugi przykład nie zwróci wiersza, jeśli bit_or(n)
to 0.
0 dla odpowiedzi nr 2
SELECT *
FROM (
SELECT BIT_OR(`n`) AS `bit`
FROM `t1`
WHERE `a` = 1
) AS `bit`
WHERE `bit`