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.

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;

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


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%'

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.


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;

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]+';

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.


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]%$';

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 木匠
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.