Saya merasa cukup sulit untuk mencapai kisaran angka seperti baris MySQL
.
Misalnya rentang 1-5 dicapai dengan:
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
akan menghasilkan:
1 2 3 4 5
untuk 0-99 saya bisa bergabung dengan dua tabel 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
Saya bosan menulis semua ini UNION
dan mencari cara untuk mengecilkan kode.
Adakah ide bagaimana membuatnya golf (misalnya rentang 0-1.000.000) di MySQL atau sintaks SQL apa pun?
Poin ekstra diberikan untuk:
- satu pernyataan
- tidak ada prosedur
- tidak ada variabel
- tidak ada pernyataan DDL
- hanya pernyataan DQL
generate_series()
. Kami memiliki beberapa contoh penggunaan di sini.Jawaban:
Untuk dialek SQL yang mendukung CTE rekursif seperti sqlite, Anda dapat melakukan sesuatu seperti berikut:
Ini tidak tergantung pada tabel yang ada dan Anda dapat mengubah klausa LIMIT seperti yang diinginkan. Saya awalnya melihat varian ini di StackOverflow.
sumber
WITH t AS(SELECT 1n UNION ALL SELECT n+1FROM t WHERE n<36)SELECT n FROM t
Untuk titik akhir yang berbeda, cukup ubah1
dan36
ke apa pun yang Anda inginkan.option (maxrecursion 0)
bagian akhir dari pernyataan saya di atas, jika tidak maka kesalahan untuk rekursi lebih dari 100. (Baik disetmaxrecursion
ke nilai tertentu, atau ke 0 untuk memungkinkan tak terbatas) .Mirip dengan metode @ BradC .
Saya menggunakan MS SQL, yang memiliki tabel
[master]
dengan kisaran angka -1 hingga 2048. Anda dapat menggunakanBETWEEN
operator untuk membuat rentang Anda.Jika Anda ingin bermain golf ini, Anda dapat melakukan:
sumber
WHERE number>0AND number<21
SELECT DISTINCT(number+2)... WHERE number<19
PostgreSQL, 35 byte
PostgreSQL memiliki kemudahan ini:
Jika Anda membutuhkannya beri nama:
Anda juga dapat melakukan ini dengan cap waktu. https://www.postgresql.org/docs/9.5/static/functions-srf.html
sumber
Opsi hebat dari pos ini (ditemukan oleh @Arnauld):
Bagi saya - ini cukup banyak memecahkan tantangan.
sumber
id
bidang diisi melalui nilai yang sangat besar. Basis data yang sangat spesifik, dan Anda bisa melewatkan satu baris jika, katakanlah, seseorang menghapus ID produk = 4021.Khusus postgreSQL
generate_series()
menghasilkan set, sehingga Anda dapat menggunakannya bukan hanya dalamfrom
klausa, tetapi di mana pun di mana set dapat terjadi:Anda juga dapat melakukan operasi langsung di set:
Jika beberapa set memiliki panjang yang sama, Anda dapat melewatinya secara paralel:
Untuk set dengan panjang berbeda, dihasilkan produk Cartesian:
Tetapi jika Anda menggunakannya dalam
from
klausa, Anda mendapatkan produk Cartesian untuk set panjang yang sama juga:Itu juga dapat menghasilkan set cap waktu. Misalnya Anda lahir pada 2000-06-30 dan ingin tahu tahun berapa Anda merayakan ulang tahun di akhir pekan:
sumber
MS SQL memiliki tabel sistem tidak terdokumentasi dalam
master
database yang disebutspt_values
. Di antara hal-hal lain, ini berisi rentang angka dari 0 hingga 2047:Berguna sebagai tabel angka hanya dengan sendirinya, tetapi dalam CTE Anda bisa mendapatkan beberapa angka besar dengan cepat:
sumber
(Ini berfungsi dalam MS-SQL, tidak yakin apakah mereka berfungsi untuk mySQL atau platform lain.)
Untuk set yang lebih kecil (dipesan atau tidak dipesan), gunakan
VALUES
konstruktor:(Ini bisa digunakan untuk apa saja, walaupun string bisa cukup panjang dengan semua tanda kutip tunggal yang diulang.)
Kemudian Anda bisa melipatgandakan menggunakan CTE bernama (ekspresi tabel umum) sehingga Anda tidak perlu mengulanginya:
Ada banyak teknik lain di luar sana, cari "SQL menghasilkan tabel angka", meskipun sebagian besar tidak dioptimalkan untuk bermain golf.
sumber
limit Y
untuk membuat rentang yang sewenang-wenang?SELECT TOP 250 ...
Satu lagi opsi, yang satu ini khusus untuk MS SQL 2016 ke atas:
Saya mungkin akan menemukan ini lebih berguna untuk daftar string, tetapi saya bisa melihat cara ini akan berguna dengan angka juga.
sumber
T-SQL, 98 byte
sumber
Lain untuk SQL Server ...
sumber