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.
sql
postgresql
Wayne Koorts
źródło
źródło
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
źródło
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%'
źródło
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.
źródło
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;
źródło
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]+';
źródło
Który z nich można indeksować?
Ten jest zdecydowanie indeksowalny przez btree:
Zwróć uwagę, że znak „:” występuje po „9” w kodzie ASCII.
źródło
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]%$';
źródło