SQL как условие для проверки целочисленности?


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

SELECT * FROM books WHERE title ILIKE "A%"

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

7 51

7 ответов:

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

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;

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

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

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

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

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

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

или независимо от того, что является эквивалентом преобразования Postgres.

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

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

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

Это определенно btree-indexable:

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

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

в PostreSQL вы можете использовать ПОХОЖЕ НА оператор (больше):

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

Если вы хотите искать как строку, вы можете привести к тексту, как это:

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