Achei bastante difícil obter um intervalo de números como linhas MySQL
.
Por exemplo, o intervalo de 1 a 5 é alcançado por:
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
vai resultar em:
1 2 3 4 5
para 0-99 eu posso cruzar duas tabelas 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
Estou cansado de escrever tudo isso UNION
e procurar uma maneira de reduzir o código.
Alguma idéia de como jogar golfe (por exemplo, faixa de 0 a 1.000.000) no MySQL ou em qualquer sintaxe SQL?
Pontos extras são dados para:
- declaração única
- sem procedimentos
- sem variáveis
- sem instruções DDL
- apenas instruções DQL
generate_series()
. Temos alguns exemplos de uso aqui.Respostas:
Para dialetos SQL compatíveis com CTEs recursivos como o sqlite, você pode fazer algo como o seguinte:
Isso não depende de nenhuma tabela existente e você pode alterar a cláusula LIMIT conforme desejado. Originalmente, vi uma variante disso no StackOverflow.
fonte
WITH t AS(SELECT 1n UNION ALL SELECT n+1FROM t WHERE n<36)SELECT n FROM t
Para diferentes pontos finais, basta alterar o1
e36
para o que quiser.option (maxrecursion 0)
ao final da minha instrução acima, caso contrário, ela gera recursões acima de 100. (Definamaxrecursion
um valor específico ou 0 para permitir infinito) .Semelhante ao método do @ BradC .
Usei o MS SQL, que possui uma tabela
[master]
com um intervalo numérico de -1 a 2048. Você pode usar oBETWEEN
operador para criar seu intervalo.Se você quiser jogar isso, você pode:
fonte
WHERE number>0AND number<21
SELECT DISTINCT(number+2)... WHERE number<19
PostgreSQL, 35 bytes
O PostgreSQL é fácil:
Se você precisar nomeado:
Você também pode fazer isso com timestamps. https://www.postgresql.org/docs/9.5/static/functions-srf.html
fonte
Ótima opção deste post (encontrado por @Arnauld):
Para mim - praticamente resolve o desafio.
fonte
id
campo preenchido por valores muito grandes. Então banco de dados específico bonita, e você pode perder uma fila se, digamos, alguém excluídos ID do produto = 4021.Específico do PostgreSQL
generate_series()
gera um conjunto, para que você possa usá-lo não apenas nafrom
cláusula, mas em qualquer lugar em que um conjunto possa ocorrer:Você também pode executar operações diretamente no aparelho:
Se vários conjuntos tiverem o mesmo comprimento, você poderá atravessá-los em paralelo:
Para conjuntos com comprimentos diferentes, é gerado um produto cartesiano:
Mas se você usá-los na
from
cláusula, também obtém produtos cartesianos para os mesmos conjuntos de comprimento:Também pode gerar um conjunto de carimbos de data / hora. Por exemplo, você nasceu em 30/06/2000 e deseja saber em que anos comemorou seu aniversário em um fim de semana:
fonte
O MS SQL possui uma tabela de sistema não documentada no
master
banco de dados chamadaspt_values
. Entre outras coisas, ele contém um intervalo de números de 0 a 2047:Útil como uma tabela de números por si só, mas em um CTE você pode obter grandes números rapidamente:
fonte
(Eles funcionam no MS-SQL, não tenho certeza se eles funcionam para o mySQL ou outras plataformas.)
Para conjuntos menores (ordenados ou não), use o
VALUES
construtor:(Isso funciona para qualquer coisa, embora as strings possam ficar muito longas com todas as aspas simples repetidas.)
Em seguida, você pode multiplicar usando uma CTE (expressão comum da tabela) nomeada para não precisar repeti-la:
Existem inúmeras outras técnicas por aí, procure por "SQL gerando uma tabela numérica", embora a maioria não seja otimizada para jogar golfe.
fonte
limit Y
para fazer intervalos arbitrários?SELECT TOP 250 ...
Mais uma opção, essa específica para o MS SQL 2016 e superior:
Provavelmente vou achar isso mais útil para listas de cadeias de caracteres, mas também posso ver como será útil com números.
fonte
T-SQL, 98 bytes
fonte
Outro para o SQL Server ...
fonte