PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Trong psql làm thế nào để chạy một Vòng lặp cho một truy vấn Chọn với CTE và nhận kết quả hiển thị nếu tôi chạy nó trong một db chỉ đọc?

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ể)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cắt tỉa phân vùng dựa trên ràng buộc kiểm tra không hoạt động như mong đợi

  2. Giới hạn kích thước của kiểu dữ liệu JSON trong PostgreSQL

  3. Tự động kiểm tra bảo mật cho PostgreSQL

  4. Làm thế nào để xác định bí danh toán tử trong PostgreSQL?

  5. Đá quý phần tiếp theo của ruby ​​- cách truy vấn mảng với phần mở rộng pg_array