Умова SQL LIKE для перевірки на ціле число?


83

Я використовую набір умов SQL LIKE, щоб пройти алфавіт і перерахувати всі елементи, що починаються з відповідної літери, наприклад, щоб отримати всі книги, де заголовок починається з літери "А":

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 (price 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%'

Або будь-який еквівалент 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 ви можете використовувати схожий на оператор ( більш ):

-- 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.