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

jika-pernyataan dengan string yang berisi kondisi

Dari komentar saya akhirnya berpikir saya mengerti. Anda memerlukan SQL dinamis :

CREATE OR REPLACE FUNCTION foo(lastcontact timestamptz)
  RETURNS void AS
$func$
DECLARE
   myrec  record;
   mycond boolean;
BEGIN

FOR myrec IN
    SELECT * FROM tabel ORDER BY colorlevel, volgnummer
LOOP
    IF myrec.conditie ~~ '%lastcontact %' THEN   -- special case for input param
        myrec.conditie := replace (myrec.conditie
                        , 'lastcontact '
                        , CASE WHEN lastcontact IS NULL THEN 'NULL '
                          ELSE '''' || lastcontact::text || ''' ' END);
    END IF;

    EXECUTE 'SELECT ' || myrec.conditie || ' FROM tabel' INTO mycond;

    IF mycond then
        RAISE NOTICE 'Condition % is true', myrec.conditie;
    ELSE
        RAISE NOTICE 'Condition % is false', COALESCE(myrec.conditie, 'NULL');
    END IF;
END LOOP;

END
$func$  LANGUAGE plpgsql;

Namun, perlu diketahui bahwa penyiapan ini terbuka lebar untuk injeksi SQL . Hanya gunakan input terverifikasi. Fungsi berfungsi di PostgreSQL 8.3 juga (tidak ada DO pernyataan, belum).

Anda tidak dapat merujuk ke parameter di dalam SQL dinamis (EXECUTE penyataan). Anda harus memasukkan nilai ke dalam string kueri.

Di PostgreSQL 8.4 atau yang lebih baru, Anda memiliki komoditas unggulan USING klausa . Sayangnya, tidak di versi 8.3. Anda harus mempertimbangkan untuk meningkatkan versi jika Anda bisa.

Saya memberikan solusi untuk versi lama Anda. Anda harus berhati-hati dengan NULL nilai.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hibernasi memperbarui satu ke banyak mengalir

  2. Ukuran database PostgreSQL meningkat

  3. Menambahkan komentar ke kolom saat saya membuat tabel di PostgreSQL?

  4. Mengonversi karakter beraksen di PostgreSQL?

  5. node-postgres mendapatkan kesalahan koneksi ECONNREFUSED