Nếu tôi giải mã quyền này, về cơ bản bạn muốn chọn tất cả những người có số hàng theo ID giảm dần xuất hiện trong địa chỉ. Sau đó, kết quả cuối cùng sẽ được giới hạn ở một số số hàng nhất định.
Sau đó, bạn không cần phải sử dụng LIMIT
rườm rà đó / OFFSET
xây dựng ở tất cả. Bạn chỉ cần sử dụng row_number()
chức năng cửa sổ.
Để lọc số hàng, bạn có thể chỉ cần sử dụng IN
. Tùy thuộc vào những gì bạn muốn ở đây, bạn có thể sử dụng danh sách các ký tự, đặc biệt nếu các số không liên tiếp. Hoặc bạn có thể sử dụng generate_series()
để tạo danh sách các số liên tiếp. Tất nhiên, bạn cũng có thể sử dụng một truy vấn con, khi các số được lưu trữ trong một bảng khác.
Với danh sách các chữ trông giống như sau:
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);
Nếu bạn muốn sử dụng generate_series()
một ví dụ sẽ là:
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));
Và một truy vấn con của một bảng khác có thể được sử dụng như vậy:
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);
Đối với các bộ số lớn hơn, bạn cũng có thể cân nhắc sử dụng INNER JOIN
trên các số thay vì IN
.
Sử dụng 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, '%');
Hoặc khi các số nằm trong một bảng khác:
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, '%');
Lưu ý rằng tôi cũng đã thay đổi đối sánh mẫu biểu thức chính quy thành LIKE
đơn giản . Điều đó sẽ làm cho các truy vấn di động hơn một chút. Nhưng tất nhiên bạn có thể thay thế điều đó bằng bất kỳ biểu thức nào bạn thực sự cần.
db <> fiddle (với một số biến thể)