আমার একই ধরণের প্রয়োজন ছিল এবং এটি আমার পক্ষে ভালভাবে কাজ করার জন্য খুঁজে পেয়েছে (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") থাকার সম্ভাবনাটি পরিচালনা করতে হয় তবে আপনি youালাইয়ের আগে সংখ্যাসূচক অক্ষরগুলি ছাঁটাতে regexp_replace ব্যবহার করতে পারেন।
CAST(REGEXP_REPLACE(COALESCE(myfield,'0'), '[^0-9]+', '', 'g') AS INTEGER)
তারপরে "বি 3 এড 5" এর মতো পাঠ্য / বর্ণের মানগুলিও সংখ্যা দেবে
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)