Czy istnieje sposób na wykrycie, czy wartość jest liczbą w zapytaniu MySQL? Jak na przykład
SELECT *
FROM myTable
WHERE isANumber(col1) = true
mysql
sql
where-clause
Urbycoz
źródło
źródło
Odpowiedzi:
To powinno działać w większości przypadków.
Nie działa w przypadku niestandardowych liczb, takich jak
1e4
1.2e5
123.
(końcowe dziesiętne)źródło
Możesz też użyć wyrażenia regularnego ... wyglądałoby to tak:
Źródła: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
źródło
WHERE col1 NOT REGEXP...
oraz w przypadku, gdy możesz mieć przecinek dziesiętny, użyj wyrażenia regularnego:^[0-9\.]+$
Jeśli Twoje dane to „test”, „test0”, „test1111”, „111test”, „111”
Aby wybrać wszystkie rekordy, w których dane są prostą liczbą int:
Wynik: `` 111 ''
(W wyrażeniu regularnym ^ oznacza początek, a $ oznacza koniec)
Aby wybrać wszystkie rekordy, w których istnieje liczba całkowita lub dziesiętna:
Wynik: „111” (tak samo jak w ostatnim przykładzie)
Na koniec, aby wybrać wszystkie rekordy, w których istnieje numer, użyj tego:
Wynik: „test0” i „test1111” oraz „111test” i „111”
źródło
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
Dopasuje również liczby dziesiętne ze znakiem (np. -1,2, +0,2, 6., 2e9, 1,2e-10 ).
Test:
Wynik:
Próbny
źródło
Zwraca wiersze liczbowe
Znalazłem rozwiązanie z następującym zapytaniem i działa dla mnie:
To zapytanie zwraca wiersze mające tylko kolumnę z liczbą większą niż zero
col1
Zwraca wiersze nienumeryczne
jeśli chcesz sprawdzić kolumnę, a nie numeryczną, spróbuj tego z trick (
!col1 > 0
):źródło
SELECT * FROM myTable WHERE col1 = 123;
zapytanie zwróci wiersze, nawet wartość col to123abc
Ta odpowiedź jest podobna do Dmitrija, ale pozwoli na ułamki dziesiętne oraz liczby dodatnie i ujemne.
źródło
użyj UDF (funkcja zdefiniowana przez użytkownika).
Wtedy, gdy zapytasz
- zwroty 0
- zwroty 1
wybierz isnumber (mycol) mycol1, col2, colx z tabeli x; - zwróci 1 i 0 dla kolumny mycol1
- możesz rozszerzyć funkcję o ułamki dziesiętne, notację naukową itp.
Zaletą korzystania z funkcji UDF jest to, że można jej używać po lewej lub prawej stronie porównania „klauzula where”. to znacznie upraszcza SQL przed wysłaniem do bazy danych:
mam nadzieję że to pomoże.
źródło
Inną alternatywą, która wydaje się szybsza niż REGEXP na moim komputerze, jest
Spowoduje to zaznaczenie wszystkich wierszy, w których col1 zaczyna się od wartości liczbowej.
źródło
AND col1<>0
aby obsłużyć ten wyjątek.'1a'
. BTW: to odpowiednikWHERE col1 <> 0
- rextester.com/DJIS1493Wciąż brakuje tej prostej wersji:
(dodawanie powinno być szybsze jako mnożenie)
Lub najwolniejsza wersja do dalszej gry:
źródło
'a' + 0 = 'a'
jest PRAWDAPolecam: jeśli twoje wyszukiwanie jest proste, możesz użyć `
`operator ciekawy :) działa i szybciej niż na polach varchar / char
źródło
select 'aaa123' >= 0
iselect '123aaa' >= 0
return true?oczywiście znak (0) wynosi zero, ale wtedy możesz ograniczyć zapytanie do ...
źródło
źródło
Odkryłem, że działa to całkiem dobrze
źródło
col1 <> 0
i daje fałszywie pozytywny wynik1a
- rextester.com/HLORBZ1242Spróbuj podzielić / 1
źródło