2009-11-05 3 views
43

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

SELECT * FROM books WHERE title ILIKE "A%" 

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

ответ

92

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

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; 
+0

Вариант 1 - это то, что я хотел, спасибо очень. –

+1

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

+0

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

12

PostgreSQL поддерживает regular expressions matching.

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

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

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

+1

Отличная ссылка, спасибо. –

1

Если предположить, что вы ищете «номера, которые начинаются с 7 «а не« струны, начинающиеся с 7 », может быть, что-то вроде

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

Или что бы то ни было эквивалент конверсии Postgres.

+0

Хороший совет для преобразования типа, спасибо. –

0

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

Это один определенно ВТКЕЕ-индексируемая:

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

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

0

В PostreSQL вы можете использовать ПОДОБНЫХ TO оператора (more):

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

Если вы хотите найти в строке, вы можете бросить в текст так:

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

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

SELECT * FROM books WHERE price > 89999 AND price < 90100; 
Смежные вопросы