Jika saya menguraikan ini dengan benar, Anda pada dasarnya ingin memilih semua orang di mana nomor baris menurut ID turun muncul di alamat. Hasil akhir kemudian harus dibatasi pada nomor baris tertentu.
Maka Anda tidak perlu menggunakan LIMIT
yang rumit itu /OFFSET
membangun sama sekali. Anda cukup menggunakan row_number()
fungsi jendela.
Untuk memfilter nomor baris, Anda cukup menggunakan IN
. Bergantung pada apa yang Anda inginkan di sini, Anda dapat menggunakan daftar literal, terutama jika jumlahnya tidak berurutan. Atau Anda dapat menggunakan generate_series()
untuk menghasilkan daftar nomor berurutan. Tentu saja Anda juga dapat menggunakan subquery, ketika nomor disimpan di tabel lain.
Dengan daftar literal yang akan terlihat seperti ini:
SELECT pn.personid,
pn.lastname,
pn.firstname,
pn.address,
pn.city
FROM (SELECT p.personid,
p.lastname,
p.firstname,
p.address,
p.city,
row_number() OVER (ORDER BY p.personid DESC) n
FROM persons p) pn
WHERE pn.address LIKE concat('%', pn.n, '%')
AND pn.n IN (1, 2, 4);
Jika Anda ingin menggunakan generate_series()
contohnya adalah:
SELECT pn.personid,
pn.lastname,
pn.firstname,
pn.address,
pn.city
FROM (SELECT p.personid,
p.lastname,
p.firstname,
p.address,
p.city,
row_number() OVER (ORDER BY p.personid DESC) n
FROM persons p) pn
WHERE pn.address LIKE concat('%', pn.n, '%')
AND pn.n IN (SELECT s.n
FROM generate_series(1, 3) s (n));
Dan subquery dari tabel lain dapat digunakan seperti ini:
SELECT pn.personid,
pn.lastname,
pn.firstname,
pn.address,
pn.city
FROM (SELECT p.personid,
p.lastname,
p.firstname,
p.address,
p.city,
row_number() OVER (ORDER BY p.personid DESC) n
FROM persons p) pn
WHERE pn.address LIKE concat('%', pn.n, '%')
AND pn.n IN (SELECT t.nmuloc
FROM elbat t);
Untuk kumpulan angka yang lebih besar, Anda juga dapat mempertimbangkan untuk menggunakan INNER JOIN
pada angka, bukan IN
.
Menggunakan generate_series()
:
SELECT pn.personid,
pn.lastname,
pn.firstname,
pn.address,
pn.city
FROM (SELECT p.personid,
p.lastname,
p.firstname,
p.address,
p.city,
row_number() OVER (ORDER BY p.personid DESC) n
FROM persons p) pn
INNER JOIN generate_series(1, 1000000) s (n)
ON s.n = pn.n
WHERE pn.address LIKE concat('%', pn.n, '%');
Atau saat angka ada di tabel lain:
SELECT pn.personid,
pn.lastname,
pn.firstname,
pn.address,
pn.city
FROM (SELECT p.personid,
p.lastname,
p.firstname,
p.address,
p.city,
row_number() OVER (ORDER BY p.personid DESC) n
FROM persons p) pn
INNER JOIN elbat t
ON t.nmuloc = pn.n
WHERE pn.address LIKE concat('%', pn.n, '%');
Perhatikan bahwa saya juga mengubah pencocokan pola ekspresi reguler menjadi LIKE
simple sederhana . Itu akan membuat kueri sedikit lebih portabel. Tapi tentu saja Anda dapat menggantinya dengan ekspresi apa pun yang benar-benar Anda butuhkan.
db<>biola (dengan beberapa varian)