Warunek SQL LIKE do sprawdzenia liczby całkowitej?

83

Używam zestawu warunków SQL LIKE, aby przejść przez alfabet i wypisać wszystkie pozycje zaczynające się na odpowiednią literę, np. Aby pobrać wszystkie książki, których tytuł zaczyna się na literę „A”:

SELECT * FROM books WHERE title ILIKE "A%"

To dobrze w przypadku liter, ale jak wypisać wszystkie pozycje zaczynające się od dowolnej cyfry? Na ile to jest warte, znajduje się w bazie danych Postgres.

Wayne Koorts
źródło

Odpowiedzi:

162

To wybierze (za pomocą wyrażenia regularnego) każdą książkę, której tytuł zaczyna się od numeru, czy tego chcesz?

SELECT * FROM books WHERE title ~ '^[0-9]'

jeśli chcesz liczb całkowitych zaczynających się od określonych cyfr, możesz użyć:

SELECT * FROM books WHERE CAST(price AS TEXT) LIKE '123%'

lub użyj (jeśli wszystkie twoje liczby mają tę samą liczbę cyfr (wtedy przydałoby się ograniczenie))

SELECT * FROM books WHERE price BETWEEN 123000 AND 123999;
Johannes Weiss
źródło
1
Podczas próby op2 otrzymuję komunikat „Jawna konwersja z typu danych int na tekst nie jest dozwolona”.
Gilad
1
Jeśli opcja 2 zwraca jawny błąd konwersji wspomniany w powyższym komentarzu (co może się zdarzyć w SQL Server i być może w innych programach), spróbuj użyć VARCHAR o wystarczająco dużym maksymalnym rozmiarze: SELECT * FROM books WHERE CAST (cena AS VARCHAR (20)) LIKE '% 123%'
bstrong
Dziękuję Ci bardzo! Mogę dodać 5 groszy: możesz też użyć: [...] CAST (cena AS TEKST) ~ * '123%' używając operatora ~ *. Możesz także użyć dowolnych wyrażeń regularnych, takich jak: [...] CAST (cena jako tekst) ~ * '^ 123 \ -? 456 $'
Arsenii
18

PostgreSQL obsługuje dopasowywanie wyrażeń regularnych .

Tak wyglądałby twój przykład

SELECT * FROM books WHERE title ~ '^\d+ ?' 

Dopasuje tytuł zaczynający się od jednej lub więcej cyfr i opcjonalnej spacji

Vinko Vrsalovic
źródło
6

Jeśli chcesz wyszukiwać jako ciąg, możesz rzutować na tekst w następujący sposób:

SELECT * FROM books WHERE price::TEXT LIKE '123%'
gellezzz
źródło
2

Zakładając, że szukasz „liczb zaczynających się od 7”, a nie „ciągów zaczynających się od 7”, może na przykład

select * from books where convert(char(32), book_id) like '7%'

Lub cokolwiek jest odpowiednikiem konwersji Postgres.

Corey Porter
źródło
2

Spóźniłem się na imprezę, ale jeśli masz do czynienia z liczbami całkowitymi o stałej długości, możesz po prostu zrobić porównanie liczb całkowitych:

SELECT * FROM books WHERE price > 89999 AND price < 90100;
skensell
źródło
2

Testowane na PostgreSQL 9.5:

- tylko cyfry

select * from books where title ~ '^[0-9]*$';

lub,

select * from books where title SIMILAR TO '[0-9]*';

- zacznij od cyfry

select * from books where title ~ '^[0-9]+';
Charlie 木匠
źródło
0

Który z nich można indeksować?

Ten jest zdecydowanie indeksowalny przez btree:

WHERE title >= '0' AND title < ':'

Zwróć uwagę, że znak „:” występuje po „9” w kodzie ASCII.

bobflux
źródło
0

W PostreSQL możesz użyć operatora PODOBNY DO ( więcej ):

-- only digits
select * from books where title similar to '^[0-9]*$';
-- start with digit
select * from books where title similar to '^[0-9]%$';
Máťa - Stitod.cz
źródło
1
tylko cyfry: gdzie tytuł ~ '^ [0-9] * $';
Charlie 木匠
Wydaje się PODOBNE DO nie działa z "^" w PostgreSQL 9.5; Wyrażenia regularne POSIX działają "~".
Charlie 木匠