2009-11-05 8 views
43

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 ex. pour obtenir tous les livres où le titre commence par la lettre « A »:Condition SQL LIKE pour vérifier l'entier?

SELECT * FROM books WHERE title ILIKE "A%" 

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

Répondre

92

Cela va sélectionner (par une regex) chaque livre qui a un titre commençant par un nombre, c'est ce que vous voulez?

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

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

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

ou utiliser (si tous vos numéros ont le même nombre de chiffres (une contrainte serait utile alors))

SELECT * FROM books WHERE price BETWEEN 123000 AND 123999; 
+0

L'option 1 est ce que je voulais, merci beaucoup. –

+1

En essayant op2, j'obtiens "La conversion explicite du type de données int en texte n'est pas autorisée." – Gilad

+0

Si l'option 2 renvoie l'erreur de conversion explicite mentionnée dans le commentaire ci-dessus (ce qui peut arriver dans SQL Server et peut-être d'autres programmes), essayez d'utiliser VARCHAR avec une taille max assez grande: SELECT * FROM LIVRES WHERE CAST (price AS VARCHAR (20)) COMME '% 123%' – bstrong

12

PostgreSQL prend en charge regular expressions matching.

Ainsi, votre exemple ressemblerait

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

Cela correspondra un titre commençant par un ou plusieurs chiffres et un espace en option

+1

Excellent lien, merci. –

1

En supposant que vous êtes à la recherche de « chiffres qui commencent par 7 "plutôt que des" chaînes qui commencent par 7 ", peut-être quelque chose comme

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

Ou quel que soit l'équivalent de conversion de Postgres.

+0

Bon conseil pour la conversion de type, merci. –

0

Lequel de ceux est indexable?

Celui-ci est sans aucun doute btree indexable:

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

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

0

En PostreSQL vous pouvez utiliser 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

Si vous souhaitez rechercher en tant que chaîne, vous pouvez jeter à texte comme ceci:

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

Je m tard à la fête ici, mais si vous avez affaire à des entiers d'une longueur fixe, vous pouvez simplement faire une comparaison entière:

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