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 $'
Арсений
18

PostgreSQL поддерживает сопоставление регулярных выражений .

Итак, ваш пример будет выглядеть так

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

Это будет соответствовать заголовку, начинающемуся с одной или нескольких цифр и необязательного пробела.

Винко Врсалович
источник
6

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

SELECT * FROM books WHERE price::TEXT LIKE '123%'
Gellezzz
источник
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;
Skensell
источник
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]%$';
Máa - Stitod.cz
источник
1
только цифры: где заголовок ~ '^ [0-9] * $';
Чарли 木匠
Кажется, ПОДОБНОЕ НЕ работает с "^" в PostgreSQL 9.5; Регулярные выражения POSIX "~" работают.
Чарли 木匠