PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पोस्टग्रेस फ़ंक्शन में टेक्स्ट इनपुट को कॉलम नाम के रूप में कैसे उपयोग करें?

गतिशील निष्पादन के लिए एक से अधिक कॉलम नामों को संयोजित स्ट्रिंग के रूप में पास करने के लिए तत्काल परिशोधन की आवश्यकता होती है। मेरा सुझाव है कि एक VARIADIC कोड> इसके बजाय फ़ंक्शन पैरामीटर, ठीक से उद्धृत पहचानकर्ताओं के साथ (quote_ident() . का उपयोग करके) इस मामले में):

CREATE OR REPLACE FUNCTION select_by_txt(z int, x int, y int, VARIADIC cols text[] = NULL, OUT res text)
  LANGUAGE plpgsql AS
$func$
BEGIN
   EXECUTE format(
$$
SELECT ST_AsMVT(mvtgeom, 'public.select_by_txt')
FROM  (
   SELECT ST_AsMVTGeom(ST_Transform(t.geom, 3857), bounds.geom) AS geom%s
   FROM   table1 t
   JOIN  (SELECT ST_TileEnvelope($1, $2, $3)) AS bounds(geom)
          ON ST_Intersects(t.geom, ST_Transform(bounds.geom, 4326))
   ) mvtgeom
$$, (SELECT ', ' || string_agg(quote_ident (col), ', ') FROM unnest(cols) col)
   )
   INTO  res
   USING z, x, y;
END
$func$;

db<>fiddle यहां

प्रारूप विनिर्देशक %I format() के लिए एक एकल . से संबंधित है पहचानकर्ता। आपको एकाधिक . के लिए और काम करना होगा पहचानकर्ता, विशेष रूप से 0-n पहचानकर्ताओं की एक चर संख्या के लिए। यह कार्यान्वयन हर एक कॉलम नाम को उद्धृत करता है, और केवल एक , . जोड़ता है यदि कोई कॉलम नाम पारित किया गया है। तो यह हर संभव इनपुट के लिए काम करता है , यहां तक ​​कि कोई इनपुट भी नहीं। नोट VARIADIC cols text[] = NULL डिफ़ॉल्ट मान के रूप में NULL के साथ अंतिम इनपुट पैरामीटर के रूप में:

संबंधित:

इस संदर्भ में कॉलम नाम केस संवेदी होते हैं!

अपने उदाहरण के लिए कॉल करें (महत्वपूर्ण!):

SELECT select_by_txt(10,32,33,'col1', 'col2');

वैकल्पिक सिंटैक्स:

SELECT select_by_txt(10,32,33, VARIADIC '{col1,col2}');

तीसरे कॉलम के नाम और दुर्भावनापूर्ण (हालांकि व्यर्थ) इरादे के साथ अधिक खुलासा कॉल:

SELECT select_by_txt(10,32,33,'col1', 'col2', $$col3'); DROP TABLE table1;--$$);

उस विषम तीसरे स्तंभ नाम और SQL इंजेक्शन के बारे में:

VAIRADIC के बारे में पैरामीटर:

OUT का उपयोग करना सादगी के लिए पैरामीटर यह पूरी तरह से वैकल्पिक है। देखें:

मैं क्या करूंगा नहीं करो

यदि आप वास्तव में, हर समय 1 या अधिक मान्य कॉलम नामों की उचित रूप से स्वरूपित सूची होने के लिए इनपुट पर वास्तव में भरोसा करते हैं - और आपने यह दावा किया है कि ...

आप कर सकते थे सरल करें:

CREATE OR REPLACE FUNCTION select_by_txt(z int, x int, y int, cols text, OUT res text)
  LANGUAGE plpgsql AS
$func$
BEGIN
   EXECUTE format(
$$
SELECT ST_AsMVT(mvtgeom, 'public.select_by_txt')
FROM  (
   SELECT ST_AsMVTGeom(ST_Transform(t.geom, 3857), bounds.geom) AS geom, %s
   FROM   table1 t
   JOIN  (SELECT ST_TileEnvelope($1, $2, $3)) AS bounds(geom)
          ON ST_Intersects(t.geom, ST_Transform(bounds.geom, 4326))
   ) mvtgeom
$$, cols
   )
   INTO  res
   USING z, x, y;
END
$func$;

(आप इतने आश्वस्त कैसे हो सकते हैं कि इनपुट हमेशा विश्वसनीय रहेगा?)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ClusterControl CLI का उपयोग करके PostgreSQL और TimescaleDB बैकअप बहाली

  2. Postgresql और psycopg2:डेटाबेस मौजूद नहीं है

  3. हाइबरनेट 3.3.2GA PostgreSQL 9.0 से बाइटा डेटा को अनुचित तरीके से लोड करता है और सभी प्रकार की मैपिंग सही हैं

  4. PostgreSQL 9.1 चुनिंदा बयानों में कोलेट का उपयोग कर

  5. पोस्टग्रेज Npgsql कनेक्शन पूलिंग