SQL - условие LIKE для проверки целого числа?


83

Я использую набор условий SQL LIKE, чтобы пройти по алфавиту и перечислить все элементы, начинающиеся с соответствующей буквы, например, чтобы получить все книги, название которых начинается с буквы «A»:

SELECT * FROM books WHERE title ILIKE "A%"

Это нормально для букв, но как мне перечислить все элементы, начинающиеся с любого числа? Для чего это стоит, это в базе данных Postgres.

Ответы:


161

Это выберет (с помощью регулярного выражения) каждую книгу, название которой начинается с числа, это то, что вы хотите?

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

если вам нужны целые числа, начинающиеся с определенных цифр, вы можете использовать:

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

или используйте (если все ваши числа имеют одинаковое количество цифр (тогда было бы полезно ограничение))

SELECT * FROM books WHERE price BETWEEN 123000 AND 123999;

1
При попытке op2 я получаю «Явное преобразование из типа данных int в текст запрещено».
Гилад

1
Если вариант 2 возвращает явную ошибку преобразования, упомянутую в комментарии выше (что может произойти в SQL Server и, возможно, в других программах), попробуйте использовать VARCHAR с достаточно большим максимальным размером: SELECT * FROM books WHERE CAST (цена AS VARCHAR (20)) НРАВИТСЯ '% 123%'
bstrong

Большое спасибо! Я могу добавить 5 пенни: вы также можете использовать: [...] CAST (цена КАК ТЕКСТ) ~ * '123%' с помощью оператора ~ *. Также вы можете использовать любые регулярные выражения внутри, например: [...] CAST (цена КАК ТЕКСТ) ~ * '^ 123 \ -? 456 $'
Арсений


6

Если вы хотите искать как строку, вы можете преобразовать ее в текст следующим образом:

SELECT * FROM books WHERE price::TEXT LIKE '123%'

2

Предполагая, что вы ищете «числа, начинающиеся с 7», а не «строки, начинающиеся с 7», возможно, что-то вроде

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

Или что бы там ни было, эквивалент convert в Postgres.


2

Я опаздываю на вечеринку, но если вы имеете дело с целыми числами фиксированной длины, вы можете просто провести целочисленное сравнение:

SELECT * FROM books WHERE price > 89999 AND price < 90100;

2

Проверено на PostgreSQL 9.5:

- только цифры

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

или же,

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

- начать с цифры

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

0

Какой из них индексируется?

Это определенно индексируется btree:

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

Обратите внимание, что ":" идет после "9" в ASCII.


0

В PostreSQL вы можете использовать оператор SIMILAR TO ( подробнее ):

-- only digits
select * from books where title similar to '^[0-9]*$';
-- start with digit
select * from books where title similar to '^[0-9]%$';

1
только цифры: где заголовок ~ '^ [0-9] * $';
Чарли 木匠

Кажется, ПОДОБНОЕ НЕ работает с "^" в PostgreSQL 9.5; Регулярные выражения POSIX "~" работают.
Чарли 木匠
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.