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.
sql
postgresql
Wayne Koorts
fuente
fuente
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
fuente
Si desea buscar como cadena, puede convertir a texto como este:
SELECT * FROM books WHERE price::TEXT LIKE '123%'
fuente
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.
fuente
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;
fuente
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]+';
fuente
¿Cuál de ellos es indexable?
Este es definitivamente indexable por btree:
Tenga en cuenta que ':' viene después de '9' en ASCII.
fuente
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]%$';
fuente