J'ai trouvé assez difficile d'obtenir une plage de nombres sous forme de lignes MySQL
.
Par exemple, la plage 1-5 est atteinte par:
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
aura pour résultat:
1 2 3 4 5
pour 0-99 je peux croiser joindre deux tables 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
J'en ai marre d'écrire tout ça UNION
s et de chercher un moyen de réduire le code.
Des idées sur la façon de jouer au golf (par exemple une plage de 0 à 1 000 000) dans MySQL ou toute syntaxe SQL?
Des points supplémentaires sont accordés pour:
- déclaration unique
- pas de procédures
- pas de variables
- aucune instruction DDL
- uniquement les instructions DQL
generate_series()
. Nous avons ici quelques exemples d'utilisation .Réponses:
Pour les dialectes SQL qui prennent en charge les CTE récursifs comme sqlite, vous pouvez faire quelque chose comme ceci:
Cela ne dépend d'aucune table existante et vous pouvez modifier la clause LIMIT comme vous le souhaitez. J'ai vu à l'origine une variante de cela sur StackOverflow.
la source
WITH t AS(SELECT 1n UNION ALL SELECT n+1FROM t WHERE n<36)SELECT n FROM t
Pour différents points de terminaison, changez simplement le1
et36
en ce que vous voulez.option (maxrecursion 0)
à la fin de ma déclaration ci-dessus, sinon il commet une erreur de récursivité sur 100. (Soit définimaxrecursion
sur une valeur spécifique, soit sur 0 pour autoriser l'infini) .Similaire à la méthode de @ BradC .
J'ai utilisé MS SQL, qui a une table
[master]
avec une plage de nombres de -1 à 2048. Vous pouvez utiliser l'BETWEEN
opérateur pour créer votre plage.Si vous voulez jouer au golf, vous pouvez faire:
la source
WHERE number>0AND number<21
SELECT DISTINCT(number+2)... WHERE number<19
PostgreSQL, 35 octets
PostgreSQL a aussi simple:
Si vous en avez besoin:
Vous pouvez également le faire avec des horodatages. https://www.postgresql.org/docs/9.5/static/functions-srf.html
la source
Grande option de ce post (trouvé par @Arnauld):
Pour moi, cela résout à peu près le défi.
la source
id
champ rempli de très grandes valeurs. Tellement spécifique à la base de données, et vous pourriez manquer une ligne si, par exemple, quelqu'un supprimait l'ID de produit = 4021.Spécifique à PostgreSQL
generate_series()
génère un ensemble, vous pouvez donc l'utiliser non seulement dans lafrom
clause, mais partout où un ensemble peut se produire:Vous pouvez également effectuer des opérations directement sur l'ensemble:
Si plusieurs ensembles ont la même longueur, vous pouvez les parcourir en parallèle:
Pour les ensembles de longueurs différentes, un produit cartésien est généré:
Mais si vous les utilisez dans la
from
clause, vous obtenez également un produit cartésien pour les mêmes ensembles de longueurs:Il peut également générer un ensemble d'horodatages. Par exemple, vous êtes né le 30/06/2000 et vous voulez savoir en quelles années vous avez célébré votre anniversaire un week-end:
la source
MS SQL a une table système non documentée dans la
master
base de données appeléespt_values
. Entre autres, il contient une plage de nombres de 0 à 2047:Utile en tant que tableau de nombres juste en soi, mais dans un CTE, vous pouvez obtenir des gros nombres assez rapidement:
la source
(Ceux-ci fonctionnent dans MS-SQL, je ne sais pas s'ils fonctionnent pour mySQL ou d'autres plates-formes.)
Pour les petits ensembles (ordonnés ou non ordonnés), utilisez le
VALUES
constructeur:(Cela fonctionne pour n'importe quoi, bien que les chaînes puissent devenir assez longues avec toutes les guillemets simples répétés.)
Ensuite, vous pouvez multiplier en utilisant un CTE nommé (expression de table commune) afin de ne pas avoir à le répéter:
Il existe de nombreuses autres techniques, recherchez «Génération SQL d'une table numérique», bien que la plupart ne soient pas optimisées pour le golf.
la source
limit Y
pour créer des plages arbitraires?SELECT TOP 250 ...
Encore une option, celle-ci spécifique à MS SQL 2016 et au-dessus:
Je trouverai probablement cela plus pratique pour les listes de chaînes, mais je peux voir comment cela sera également utile avec les nombres.
la source
T-SQL, 98 octets
la source
Un autre pour SQL Server ...
la source