Me resultó bastante difícil lograr un rango de números en filas MySQL
.
Por ejemplo, el rango 1-5 se logra mediante:
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
resultará en:
1 2 3 4 5
para 0-99 puedo unir dos tablas de 0-9:
CREATE TABLE nums as
SELECT 0 as num
UNION
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 6
UNION
SELECT 7
UNION
SELECT 8
UNION
SELECT 9
;
Select n.num*10+nums.num v
From nums n cross join nums
Estoy cansado de escribir todos estos UNION
correos electrónicos y buscar una forma de reducir el código.
¿Alguna idea de cómo jugar golf (por ejemplo, rango de 0-1,000,000) en MySQL o cualquier sintaxis SQL?
Se otorgan puntos adicionales por:
- declaración única
- sin procedimientos
- sin variables
- sin declaraciones DDL
- solo sentencias DQL
generate_series()
. Tenemos un par de ejemplos de uso. aquí.Respuestas:
Para dialectos de SQL que admiten CTE recursivos como sqlite, puede hacer algo como lo siguiente:
Esto no depende de ninguna tabla existente y puede cambiar la cláusula LIMIT como desee. Originalmente vi una variante de esto en StackOverflow.
fuente
WITH t AS(SELECT 1n UNION ALL SELECT n+1FROM t WHERE n<36)SELECT n FROM t
para diferentes puntos finales, simplemente cambie el1
y36
a lo que desee.option (maxrecursion 0)
al final de mi declaración anterior, de lo contrario, se produce un error de recursión superior a 100. (Establezcamaxrecursion
un valor específico o 0 para permitir infinito) .Similar al método de @ BradC .
Usé MS SQL, que tiene una tabla
[master]
con un rango de números de -1 a 2048. Puede usar elBETWEEN
operador para crear su rango.Si quieres jugar al golf, puedes hacer:
fuente
WHERE number>0AND number<21
SELECT DISTINCT(number+2)... WHERE number<19
PostgreSQL, 35 bytes
PostgreSQL tiene esto fácil:
Si lo necesitas se llama:
También puede hacer esto con marcas de tiempo. https://www.postgresql.org/docs/9.5/static/functions-srf.html
fuente
Gran opción de esta publicación (encontrada por @Arnauld):
Para mí, prácticamente resuelve el desafío.
fuente
id
campo poblado a través de valores muy grandes. Tan bonita base de datos específica, y podría perderse una fila si, por ejemplo, alguien elimina el ID del producto = 4021.PostgreSQL específico
generate_series()
genera un conjunto, por lo que puede usarlo no solo en lafrom
cláusula, sino en cualquier lugar donde pueda ocurrir un conjunto:También puede realizar operaciones directamente en el conjunto:
Si varios conjuntos tienen la misma longitud, puede atravesarlos en paralelo:
Para conjuntos con diferentes longitudes se genera un producto cartesiano:
Pero si los usa en la
from
cláusula, también obtiene el producto cartesiano para conjuntos de la misma longitud:También puede generar un conjunto de marcas de tiempo. Por ejemplo, usted nació el 30-06-2002 y quiere saber en qué años celebró su cumpleaños en un fin de semana:
fuente
MS SQL tiene una tabla de sistema no documentada en la
master
base de datos llamadaspt_values
. Entre otras cosas, contiene un rango de números del 0 al 2047:Útil como tabla de números por sí sola, pero en un CTE puede obtener algunos números grandes con bastante rapidez:
fuente
(Funcionan en MS-SQL, no estoy seguro si funcionan para mySQL u otras plataformas).
Para conjuntos más pequeños (ordenados o no ordenados), use el
VALUES
constructor:(Esto funciona para cualquier cosa, aunque las cadenas pueden ser bastante largas con todas las comillas simples repetidas).
Luego puede realizar una multiplicación cruzada utilizando un CTE con nombre (expresión de tabla común) para que no tenga que repetirlo:
Existen muchas otras técnicas, busque "SQL que genera una tabla de números", aunque la mayoría no están optimizadas para jugar al golf.
fuente
limit Y
para hacer rangos arbitrarios?SELECT TOP 250 ...
Una opción más, esta específica para MS SQL 2016 y superior:
Probablemente encuentre esto más útil para las listas de cadenas, pero puedo ver formas en que también será útil con números.
fuente
T-SQL, 98 bytes
fuente
Otro para SQL Server ...
fuente