SQL LIKE условие для проверки целого?
Я использую набор условий SQL LIKE для прохождения через алфавит и список всех элементов, начинающихся с соответствующей буквы, например. чтобы получить все книги, где название начинается с буквы "A":
SELECT * FROM books WHERE title ILIKE "A%"
Это хорошо для писем, но как мне перечислить все элементы, начиная с любого числа? Для чего это стоит в DB Postgres.
Ответы
Ответ 1
Что будет выбирать (по регулярному выражению) каждую книгу, которая имеет название, начинающееся с числа, это то, что вы хотите?
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;
Ответ 2
PostgreSQL поддерживает регулярные выражения, соответствующие.
Итак, ваш пример будет выглядеть как
SELECT * FROM books WHERE title ~ '^\d+ ?'
Это будет соответствовать заголовку, начинающемуся с одной или нескольких цифр и необязательным пространством
Ответ 3
Предполагая, что вы ищете "числа, начинающиеся с 7", а не "строки, начинающиеся с 7", возможно, что-то вроде
select * from books where convert(char(32), book_id) like '7%'
Или независимо от эквивалента конверсии Postgres.
Ответ 4
Какой из индексов можно индексировать?
Это, безусловно, btree-indexable:
WHERE title >= '0' AND title < ':'
Обратите внимание, что ':' появляется после "9" в ASCII.
Ответ 5
В PostreSQL вы можете использовать оператор ПОДОБНЫЙ TO (больше):
-- only digits
select * from books where title similar to '^[0-9]*$';
-- start with digit
select * from books where title similar to '^[0-9]%$';
Ответ 6
Если вы хотите выполнить поиск в виде строки, вы можете использовать текст следующим образом:
SELECT * FROM books WHERE price::TEXT LIKE '123%'
Ответ 7
Я опаздываю на вечеринку здесь, но если вы имеете дело с целыми числами фиксированной длины, вы можете просто провести целочисленное сравнение:
SELECT * FROM books WHERE price > 89999 AND price < 90100;