Ich fand es ziemlich schwierig, eine Reihe von Zahlen als Zeilen zu erreichen MySQL
.
Zum Beispiel wird der Bereich 1-5 erreicht durch:
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
wird darin enden, dass:
1 2 3 4 5
Für 0-99 kann ich zwei 0-9-Tische kreuzen:
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
Ich bin es leid, all diese UNION
s zu schreiben und nach einer Möglichkeit zu suchen, den Code zu verkleinern.
Irgendwelche Ideen, wie man in MySQL oder einer anderen SQL-Syntax Golf spielt (zum Beispiel im Bereich von 0-1.000.000)?
Zusätzliche Punkte werden vergeben für:
- einzelne Aussage
- keine Prozeduren
- keine Variablen
- keine DDL-Anweisungen
- nur DQL-Anweisungen
generate_series()
. Wir haben hier einige Anwendungsbeispiele .Antworten:
Für SQL-Dialekte, die rekursive CTEs wie SQLite unterstützen , können Sie Folgendes tun:
Dies hängt nicht von einer vorhandenen Tabelle ab, und Sie können die LIMIT-Klausel nach Bedarf ändern. Ich habe ursprünglich eine Variante davon auf StackOverflow gesehen.
quelle
WITH t AS(SELECT 1n UNION ALL SELECT n+1FROM t WHERE n<36)SELECT n FROM t
Ändern Sie für verschiedene Endpunkte einfach das1
und36
nach Ihren Wünschen .option (maxrecursion 0)
zu Ende meiner obigen Aussage, sonst ist es Fehler aus für Rekursion über 100. (Entweder Satzmaxrecursion
auf einen bestimmten Wert oder auf 0 ermöglichen unendlich) .Ähnlich wie bei @ BradC .
Ich habe MS SQL verwendet, das eine Tabelle
[master]
mit einem Zahlenbereich von -1 bis 2048 enthält. Sie können denBETWEEN
Operator verwenden, um Ihren Bereich zu erstellen.Wenn Sie Golf spielen möchten, können Sie:
quelle
WHERE number>0AND number<21
SELECT DISTINCT(number+2)... WHERE number<19
PostgreSQL, 35 Bytes
So einfach funktioniert PostgreSQL:
Wenn Sie es mit dem Namen brauchen:
Sie können dies auch mit Zeitstempeln tun. https://www.postgresql.org/docs/9.5/static/functions-srf.html
quelle
Gute Option von diesem Beitrag (gefunden von @Arnauld):
Für mich - es löst so ziemlich die Herausforderung.
quelle
id
Feld mit sehr großen Werten vorhanden ist. So hübsch datenbankspezifisch, und Sie könnten eine Zeile verpassen, wenn beispielsweise jemand die Produkt-ID = 4021 gelöscht hat.PostgreSQL-spezifisch
generate_series()
generiert eine Menge, sodass Sie sie nicht nur infrom
Klausel, sondern überall dort verwenden können, wo eine Menge auftreten kann:Sie können auch direkt am Gerät arbeiten:
Wenn mehrere Sätze die gleiche Länge haben, können Sie sie parallel durchlaufen:
Für Sets mit unterschiedlichen Längen wird ein kartesisches Produkt erzeugt:
Wenn Sie sie jedoch in der
from
Klausel verwenden, erhalten Sie das kartesische Produkt auch für Sätze gleicher Länge:Es kann auch eine Reihe von Zeitstempeln erzeugen. Sie sind zum Beispiel am 30.06.2000 geboren und möchten wissen, in welchen Jahren Sie an einem Wochenende Geburtstag gefeiert haben:
quelle
MS SQL hat eine undokumentierte Systemtabelle in der
master
Datenbank aufgerufenspt_values
. Es enthält unter anderem einen Zahlenbereich von 0 bis 2047:Nützlich als Nummerntabelle, aber in einem CTE können Sie ziemlich schnell einige große Nummern erhalten:
quelle
(Diese funktionieren in MS-SQL, nicht sicher, ob sie für mySQL oder andere Plattformen funktionieren.)
Verwenden Sie für kleinere Mengen (bestellt oder nicht bestellt) den
VALUES
Konstruktor:(Dies funktioniert für alles, obwohl Zeichenfolgen mit all den wiederholten einfachen Anführungszeichen ziemlich lang werden können.)
Dann können Sie mit einem benannten CTE (Common Table Expression) eine Kreuzmultiplikation durchführen, damit Sie ihn nicht wiederholen müssen:
Es gibt Unmengen anderer Techniken, suchen Sie nach "SQL, das eine Zahlentabelle generiert", obwohl die meisten nicht für das Golfen optimiert sind.
quelle
limit Y
, um beliebige Bereiche zu machen?SELECT TOP 250 ...
Eine weitere Option, diese speziell für MS SQL 2016 und höher:
Ich finde das wahrscheinlich praktischer für Listen von Zeichenfolgen, aber ich kann sehen, wie es auch bei Zahlen nützlich sein wird.
quelle
T-SQL, 98 Bytes
quelle
Ein weiteres für SQL Server ...
quelle