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

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;

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


6

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

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

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.


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;

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]+';

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.


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]%$';

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 木匠
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.