¿Condición de SQL LIKE para verificar el número entero?

83

Estoy usando un conjunto de condiciones SQL LIKE para recorrer el alfabeto y enumerar todos los elementos que comienzan con la letra adecuada, por ejemplo, para obtener todos los libros donde el título comienza con la letra "A":

SELECT * FROM books WHERE title ILIKE "A%"

Eso está bien para las letras, pero ¿cómo enumero todos los elementos que comienzan con cualquier número? Por lo que vale, esto está en una base de datos de Postgres.

Wayne Koorts
fuente

Respuestas:

161

Eso seleccionará (por una expresión regular) todos los libros que tengan un título que comience con un número, ¿es eso lo que quieres?

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

si desea números enteros que comiencen con dígitos específicos, puede usar:

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

o use (si todos sus números tienen el mismo número de dígitos (una restricción sería útil entonces))

SELECT * FROM books WHERE price BETWEEN 123000 AND 123999;
Johannes Weiss
fuente
1
Cuando intento op2, obtengo "No se permite la conversión explícita del tipo de datos int a text".
Gilad
1
Si la opción 2 devuelve el error de conversión explícito mencionado en el comentario anterior (que puede suceder en SQL Server y quizás en otros programas), intente usar VARCHAR con un tamaño máximo lo suficientemente grande: SELECT * FROM books WHERE CAST (price AS VARCHAR (20)) COMO '% 123%'
bstrong
¡Muchas gracias! Puedo agregar 5 centavos: también puede usar: [...] CAST (price AS TEXT) ~ * '123%' usando el operador ~ *. También puede usar cualquier expresión regular dentro, como: [...] CAST (price AS TEXT) ~ * '^ 123 \ -? 456 $'
Arsenii
18

PostgreSQL admite la coincidencia de expresiones regulares .

Entonces, tu ejemplo se vería así

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

Esto coincidirá con un título que comience con uno o más dígitos y un espacio opcional

Vinko Vrsalovic
fuente
6

Si desea buscar como cadena, puede convertir a texto como este:

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

Suponiendo que está buscando "números que comienzan con 7" en lugar de "cadenas que comienzan con 7", tal vez algo como

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

O cualquiera que sea el equivalente de Postgres a convertir.

Corey Porter
fuente
2

Llego tarde a la fiesta aquí, pero si está tratando con números enteros de una longitud fija, puede hacer una comparación de números enteros:

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

Probado en PostgreSQL 9.5:

- solo dígitos

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

o,

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

- empezar con dígitos

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

¿Cuál de ellos es indexable?

Este es definitivamente indexable por btree:

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

Tenga en cuenta que ':' viene después de '9' en ASCII.

bobflux
fuente
0

En PostreSQL puede usar el operador SIMILAR TO ( más ):

-- only digits
select * from books where title similar to '^[0-9]*$';
-- start with digit
select * from books where title similar to '^[0-9]%$';
Máťa - Stitod.cz
fuente
1
solo dígitos: donde título ~ '^ [0-9] * $';
Charlie 木匠
Parece que SIMILAR TO no funciona con "^" en PostgreSQL 9.5; Las expresiones regulares POSIX "~" funcionan.
Charlie 木匠