Trudno mi było osiągnąć zakres liczb w rzędach MySQL
.
Na przykład zakres 1-5 osiąga się poprzez:
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
spowoduje:
1 2 3 4 5
dla 0-99 mogę połączyć krzyżowo dwie tabele 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
Mam dość pisania tych wszystkich UNION
i szukania sposobu na zmniejszenie kodu.
Jakieś pomysły na grę w golfa (na przykład zakres 0–1 000 000) w MySQL lub w dowolnej składni SQL?
Dodatkowe punkty są przyznawane za:
- pojedyncze oświadczenie
- bez procedur
- bez zmiennych
- brak instrukcji DDL
- tylko instrukcje DQL
generate_series()
. Mamy tutaj kilka przykładów użycia .Odpowiedzi:
W przypadku dialektów SQL, które obsługują rekurencyjne CTE, takie jak sqlite, możesz wykonać następujące czynności:
Nie zależy to od żadnej istniejącej tabeli i można dowolnie zmienić klauzulę LIMIT. Pierwotnie widziałem wariant tego na StackOverflow.
źródło
WITH t AS(SELECT 1n UNION ALL SELECT n+1FROM t WHERE n<36)SELECT n FROM t
dla różnych punktów końcowych, po prostu zmień1
i36
na cokolwiek chcesz.option (maxrecursion 0)
na końcu mojej powyższej instrukcji, w przeciwnym razie wystąpi błąd rekursji powyżej 100. (Ustawmaxrecursion
na określoną wartość lub na 0, aby zezwolić na nieskończoność) .Podobne do metody @ BradC .
Użyłem MS SQL, który ma tabelę
[master]
z zakresem liczb od -1 do 2048. Możesz użyćBETWEEN
operatora do utworzenia swojego zakresu.Jeśli chcesz zagrać w golfa, możesz:
źródło
WHERE number>0AND number<21
SELECT DISTINCT(number+2)... WHERE number<19
PostgreSQL, 35 bajtów
PostgreSQL ma to łatwe:
Jeśli potrzebujesz, o nazwie:
Możesz to również zrobić za pomocą znaczników czasu. https://www.postgresql.org/docs/9.5/static/functions-srf.html
źródło
Świetna opcja z tego postu (znaleziona przez @Arnauld):
Dla mnie - prawie rozwiązuje to wyzwanie.
źródło
id
pole wypełnione bardzo dużymi wartościami. Tak specyficzna dla bazy danych i można pominąć wiersz, jeśli, powiedzmy, ktoś usunął ID produktu = 4021.Specyficzne dla PostgreSQL
generate_series()
generuje zestaw, dzięki czemu można go używać nie tylko wfrom
klauzuli, ale wszędzie tam, gdzie może wystąpić zestaw:Możesz także wykonywać operacje bezpośrednio na zestawie:
Jeśli wiele zestawów ma tę samą długość, możesz je przechodzić równolegle:
Dla zestawów o różnych długościach generowany jest produkt kartezjański:
Ale jeśli użyjesz ich w
from
klauzuli, otrzymasz również produkt kartezjański dla zestawów o tej samej długości:Może także generować zestaw znaczników czasu. Na przykład urodziłeś się w dniu 2000-06-30 i chcesz wiedzieć, w których latach świętowałeś urodziny w weekend:
źródło
MS SQL ma nieudokumentowaną tabelę systemową w
master
bazie danych o nazwiespt_values
. Między innymi zawiera zakres liczb od 0 do 2047:Przydatny jako tablica liczb sam w sobie, ale w CTE można dość szybko uzyskać kilka dużych liczb:
źródło
(Działają w MS-SQL, nie jestem pewien, czy działają na mySQL lub na innych platformach.)
W przypadku mniejszych zestawów (zamówionych lub niezamówionych) użyj
VALUES
konstruktora:(Działa to na wszystko, chociaż ciągi znaków mogą się wydłużać przy wszystkich powtarzających się pojedynczych cudzysłowach.)
Następnie możesz pomnożyć krzyżowo, używając nazwanego CTE (wspólne wyrażenie tabelowe), więc nie musisz go powtarzać:
Istnieje mnóstwo innych technik, poszukaj „SQL generujący tabelę liczb”, chociaż większość nie jest zoptymalizowana do gry w golfa.
źródło
limit Y
tworząc dowolne zakresy?SELECT TOP 250 ...
Jeszcze jedna opcja, ta specyficzna dla MS SQL 2016 i nowszych:
Prawdopodobnie uznaję to za bardziej przydatne w przypadku list ciągów, ale widzę, że przydałoby się to również w przypadku liczb.
źródło
T-SQL, 98 bajtów
źródło
Kolejny dla SQL Server ...
źródło