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

Postgres tìm tất cả các hàng trong bảng cơ sở dữ liệu khớp với tiêu chí trên một cột nhất định

Tôi đã dành thời gian để làm cho nó phù hợp với bạn.

Đối với người mới bắt đầu, một số thông tin về những gì đang diễn ra bên trong mã.

Giải thích

    Hàm
  1. nhận hai đối số đầu vào:tên cột và giá trị cột
  2. nó yêu cầu một loại đã tạo mà nó sẽ trả về một tập hợp
  3. vòng lặp đầu tiên xác định các bảng có tên cột được chỉ định làm đối số đầu vào
  4. sau đó, nó tạo thành một truy vấn tổng hợp tất cả các hàng phù hợp với điều kiện đầu vào bên trong mọi bảng được thực hiện từ bước 3 với so sánh dựa trên ILIKE - theo ví dụ của bạn
  5. Hàm
  6. chỉ đi vào vòng lặp thứ hai nếu có ít nhất một hàng trong bảng hiện được truy cập phù hợp với điều kiện đã chỉ định (khi đó mảng không rỗng)
  7. vòng lặp thứ hai giải phóng mảng các hàng phù hợp với điều kiện và đối với mọi phần tử, nó sẽ đưa nó vào đầu ra của hàm với RETURN NEXT rec mệnh đề

Ghi chú

  • Tìm kiếm bằng LIKE không hiệu quả - Tôi khuyên bạn nên thêm đối số đầu vào khác "loại cột" và hạn chế đối số này trong tra cứu bằng cách thêm một phép nối vào pg_catalog.pg_type bảng.

  • Vòng lặp thứ hai ở đó để nếu tìm thấy nhiều hơn 1 hàng cho một bảng cụ thể, thì mọi hàng đều được trả về.

  • Nếu bạn đang tìm kiếm thứ gì đó khác, chẳng hạn như bạn cần các cặp khóa-giá trị, không chỉ các giá trị, thì bạn cần mở rộng hàm. Ví dụ, bạn có thể tạo định dạng json từ các hàng.

Bây giờ, đến mã.

Trường hợp thử nghiệm

CREATE TABLE tbl1 (col1 int, id int); -- does contain values
CREATE TABLE tbl2 (col1 int, col2 int); -- doesn't contain column "id"
CREATE TABLE tbl3 (id int, col5 int); -- doesn't contain values

INSERT INTO tbl1 (col1, id)
  VALUES (1, 5), (1, 33), (1, 25);

Bảng lưu trữ dữ liệu:

postgres=# select * From tbl1;

 col1 | id
------+----
    1 |  5
    1 | 33
    1 | 25
(3 rows)

Tạo kiểu

CREATE TYPE sometype AS ( schemaname text, tablename text, colname text, entirerow text );

Mã chức năng

CREATE OR REPLACE FUNCTION search_tables_for_column (
    v_column_name text
  , v_column_value text
)
RETURNS SETOF sometype
LANGUAGE plpgsql
STABLE
AS
$$
DECLARE
  rec           sometype%rowtype;
  v_row_array   text[];
  rec2          record;
  arr_el        text;
BEGIN
FOR rec IN
  SELECT 
      nam.nspname AS schemaname
    , cls.relname AS tablename
    , att.attname AS colname
    , null::text AS entirerow
  FROM 
    pg_attribute att
    JOIN pg_class cls ON att.attrelid = cls.oid 
    JOIN pg_namespace nam ON cls.relnamespace = nam.oid 
  WHERE 
    cls.relkind = 'r'
    AND att.attname = v_column_name
LOOP
  EXECUTE format('SELECT ARRAY_AGG(row(tablename.*)::text) FROM %I.%I AS tablename WHERE %I::text ILIKE %s',
    rec.schemaname, rec.tablename, rec.colname, quote_literal(concat('%',v_column_value,'%'))) INTO v_row_array;
  IF v_row_array is not null THEN
    FOR rec2 IN
      SELECT unnest(v_row_array) AS one_row
    LOOP
      rec.entirerow := rec2.one_row;
      RETURN NEXT rec;
    END LOOP;
  END IF;
END LOOP;
END
$$;

Đầu ra và cuộc gọi mẫu

postgres=# select * from search_tables_for_column('id','5');

 schemaname | tablename | colname | entirerow
------------+-----------+---------+-----------
 public     | tbl1      | id      | (1,5)
 public     | tbl1      | id      | (1,25)
(2 rows)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt hàng có điều kiện bởi

  2. chỉ mục không xác định cho cookie trong một số trình duyệt

  3. Nhiều khóa chính cho bảng app_employee không được phép.

  4. Làm thế nào để thực hiện các bài kiểm tra đơn vị với cơ sở dữ liệu h2 nơi bpchar được sử dụng?

  5. Gấu trúc ghi khung dữ liệu vào lược đồ postgresql khác