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 UNIONcorreos 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 tpara diferentes puntos finales, simplemente cambie el1y36a 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. (Establezcamaxrecursionun 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 elBETWEENoperador para crear su rango.Si quieres jugar al golf, puedes hacer:
fuente
WHERE number>0AND number<21SELECT DISTINCT(number+2)... WHERE number<19PostgreSQL, 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
idcampo 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 lafromclá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
fromclá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
masterbase 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
VALUESconstructor:(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 Ypara 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