web-dev-qa-db-fra.com

SQL LIKE condition pour vérifier l'entier?

J'utilise un ensemble de conditions SQL LIKE pour parcourir l'alphabet et répertorier tous les éléments commençant par la lettre appropriée, par exemple. pour obtenir tous les livres dont le titre commence par la lettre "A":

SELECT * FROM books WHERE title ILIKE "A%"

C'est bien pour les lettres, mais comment puis-je lister tous les éléments commençant par un nombre? Pour ce que ça vaut, c'est sur une base de données Postgres.

53
Wayne Koorts

Cela sélectionnera (par une regex) chaque livre dont le titre commence par un numéro, est-ce ce que vous voulez?

SELECT * FROM books WHERE title ~ '^[0-9]'

si vous voulez des entiers qui commencent par des chiffres spécifiques, vous pouvez utiliser:

SELECT * FROM books WHERE CAST(price AS TEXT) LIKE '123%'

ou utilisez (si tous vos nombres ont le même nombre de chiffres (une contrainte serait alors utile))

SELECT * FROM books WHERE price BETWEEN 123000 AND 123999;
114
Johannes Weiss

PostgreSQL supporte les expressions régulières correspondantes .

Ainsi, votre exemple ressemblerait à

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

Cela correspondra à un titre commençant par un ou plusieurs chiffres et un espace optionnel

14
Vinko Vrsalovic

Je suis en retard pour la fête ici, mais si vous avez affaire à des entiers de longueur fixe, vous pouvez simplement faire la comparaison d'entiers:

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

En supposant que vous recherchiez des "nombres commençant par 7" plutôt que des "chaînes commençant par 7", par exemple,

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

Ou quel que soit l’équivalent Postgres de convert.

1
Corey Porter

Testé sur PostgreSQL 9.5:

- seulement des chiffres

select * from books where title ~ '^[0-9]*$';

ou,

select * from books where title SIMILAR TO '[0-9]*';

- commence par chiffre

select * from books where title ~ '^[0-9]+';
1
Charlie 木匠

Dans PostgreSQL, vous pouvez utiliser l'opérateur SIMILAR 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
Máťa - Stitod.cz

Si vous souhaitez rechercher sous forme de chaîne, vous pouvez convertir le texte en texte comme suit:

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

Lequel de ceux-ci est indexable?

Celui-ci est définitivement btree-indexable:

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

Notez que ':' vient après '9' en ASCII.

0
peufeu