मुझे उसी तरह की आवश्यकता थी और यह मेरे लिए अच्छी तरह से काम करने के लिए मिला (पोस्टग्रेज 8.4):
CAST((COALESCE(myfield,'0')) AS INTEGER)
प्रदर्शित करने के लिए कुछ परीक्षण मामले:
db=> select CAST((COALESCE(NULL,'0')) AS INTEGER);
int4
------
0
(1 row)
db=> select CAST((COALESCE('','0')) AS INTEGER);
int4
------
0
(1 row)
db=> select CAST((COALESCE('4','0')) AS INTEGER);
int4
------
4
(1 row)
db=> select CAST((COALESCE('bad','0')) AS INTEGER);
ERROR: invalid input syntax for integer: "bad"
यदि आपको गैर-संख्यात्मक पाठ वाले क्षेत्र की संभावना को संभालने की आवश्यकता है (जैसे कि "100bad") तो आप कलाकारों से पहले गैर-संख्यात्मक वर्णों को हटाने के लिए regexp_replace का उपयोग कर सकते हैं।
CAST(REGEXP_REPLACE(COALESCE(myfield,'0'), '[^0-9]+', '', 'g') AS INTEGER)
फिर "b3ad5" जैसे टेक्स्ट / वर्चर मान भी नंबर देंगे
db=> select CAST(REGEXP_REPLACE(COALESCE('b3ad5','0'), '[^0-9]+', '', 'g') AS INTEGER);
regexp_replace
----------------
35
(1 row)
सभी मामलों के लिए 0 नहीं देने के समाधान के साथ क्रिस कॉगडॉन की चिंता को दूर करने के लिए, जैसे "खराब" (बिल्कुल कोई वर्ण वर्ण नहीं) जैसे मामले में, मैंने यह समायोजित बयान दिया:
CAST((COALESCE(NULLIF(REGEXP_REPLACE(myfield, '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
यह सरल समाधानों के समान काम करता है, सिवाय 0 तब देगा जब परिवर्तित करने के लिए मूल्य केवल गैर-अंक वर्ण होते हैं, जैसे कि "खराब":
db=> select CAST((COALESCE(NULLIF(REGEXP_REPLACE('no longer bad!', '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
coalesce
----------
0
(1 row)