PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Postgres menemukan semua baris dalam tabel database yang cocok dengan kriteria pada kolom tertentu

Saya meluangkan waktu untuk membuatnya bekerja untuk Anda.

Sebagai permulaan, beberapa informasi tentang apa yang terjadi di dalam kode.

Penjelasan

  1. fungsi membutuhkan dua argumen input:nama kolom dan nilai kolom
  2. memerlukan tipe yang dibuat yang akan mengembalikan satu set
  3. loop pertama mengidentifikasi tabel yang memiliki nama kolom yang ditentukan sebagai argumen input
  4. kemudian membentuk query yang menggabungkan semua baris yang cocok dengan kondisi input di dalam setiap tabel yang diambil dari langkah 3 dengan perbandingan berdasarkan ILIKE - sesuai contoh Anda
  5. fungsi masuk ke loop kedua hanya jika setidaknya ada satu baris dalam tabel yang dikunjungi saat ini yang cocok dengan kondisi yang ditentukan (maka array bukan null)
  6. loop kedua membuka sarang larik baris yang cocok dengan kondisi dan untuk setiap elemen ia menempatkannya dalam output fungsi dengan RETURN NEXT rec klausa

Catatan

  • Pencarian dengan LIKE tidak efisien - Saya sarankan menambahkan argumen input lain "tipe kolom" dan membatasinya dalam pencarian dengan menambahkan gabungan ke pg_catalog.pg_type tabel.

  • Loop kedua ada sehingga jika lebih dari 1 baris ditemukan untuk tabel tertentu, maka setiap baris akan dikembalikan.

  • Jika Anda mencari sesuatu yang lain, seperti Anda memerlukan pasangan nilai kunci, bukan hanya nilainya, maka Anda perlu memperluas fungsinya. Misalnya, Anda dapat membuat format json dari baris.

Sekarang, ke kodenya.

Kasus uji

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

Tabel menyimpan data:

postgres=# select * From tbl1;

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

Membuat jenis

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

Kode fungsi

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
$$;

Panggilan &keluaran teladan

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. Kesalahan saat membuka pgAdmin 4 di mac

  2. Cara menggunakan array_agg() untuk varchar[]

  3. urutan postgresql nextval dalam skema

  4. Mengapa sedikit perubahan dalam istilah penelusuran sangat memperlambat kueri?

  5. Gabung tabel dari database yang berbeda (PostgreSQL)