টাইপকাস্ট স্ট্রিংটি পূর্ণসংখ্যা - পোস্টগ্রিস


122

আমি একটি টেবিল থেকে ডেটা আমদানি করছি যা ভারচরে কাঁচা ফিড রয়েছে, আমার স্ট্রিং কলামে বারচারে একটি কলামটি আমদানি করা দরকার। আমি <column_name>::integerপাশাপাশি ব্যবহার করার চেষ্টা করেছি to_number(<column_name>,'9999999')তবে আমি ত্রুটিগুলি পাচ্ছি, কারণ কয়েকটি খালি ক্ষেত্র রয়েছে, আমাকে এগুলি নতুন টেবিলের খালি বা নাল হিসাবে পুনরুদ্ধার করতে হবে।

দয়া করে আমাকে জানতে দিন যদি এর জন্য কোনও ফাংশন থাকে।


5
আপনি আমাদের ত্রুটি বার্তা প্রদর্শন করতে পারেন? এটি সাহায্য করবে
ফ্রাঙ্ক হিকেন্স

উত্তর:


124

বুনো অনুমান: আপনার মানটি যদি খালি স্ট্রিং হয় তবে আপনি এটি নুলির জন্য প্রতিস্থাপন করতে নুলিফ ব্যবহার করতে পারেন:

SELECT
    NULLIF(your_value, '')::int

55

এমনকি আপনি আরও কিছুতে যেতে পারেন এবং এই গতিযুক্ত ক্ষেত্রের উপর যেমন সীমাবদ্ধ করতে পারেন যেমন, উদাহরণস্বরূপ: -

SELECT CAST(coalesce(<column>, '0') AS integer) as new_field
from <table>
where CAST(coalesce(<column>, '0') AS integer) >= 10; 

27

যদি আপনাকে খালি কলামগুলি NULLগুলি হিসাবে বিবেচনা করতে হয় তবে এটি ব্যবহার করে দেখুন:

SELECT CAST(nullif(<column>, '') AS integer);

অন্যদিকে, আপনার যদি NULLমূল্যবোধগুলি এড়াতে হয় তবে তা চেষ্টা করুন:

SELECT CAST(coalesce(<column>, '0') AS integer);

আমি সম্মত হই না, ত্রুটি বার্তা অনেক সাহায্য করবে।


24

নুল, বা বিশেষ অক্ষর বা খালি স্ট্রিংয়ের কারণে ত্রুটি না পেয়ে আমি সফল হয়েছি এটি করার মাধ্যমে:

SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table

2
আমার জন্য (9.6.2) এটি কেবলমাত্র কাজ করেছিল যা অন্য সমস্ত উত্তর ব্যর্থ হয়েছিল।
জেস্পার ডি ভ্রিজ

2
আপনি একটি যোগ করতে পারেন না WHERE <column> != NULL?
ম্যাথিউউ

13

আমি লুকাসের পোস্টে মন্তব্য করতে পারছি না (খুব সামান্য খ্যাতি? আমি বেশ নতুন)

আমার পিজি সেটআপটি to_number(NULL)কাজ করে না, সুতরাং আমার সমাধানটি হবে:

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table

1
এটি কাজ করা উচিত, তবে এটি কম ভার্বোস NULLIF()পদ্ধতির ঠিক সমতুল্য হওয়া উচিত । স্ট্যান্ডার্ডটি আসলে নুল্লিফকে সিএসএসির পূর্বাভাসের একটি রূপ হিসাবে সংজ্ঞায়িত করে।
কেজিগ্রিটন

12

মানটিতে যদি সংখ্যার অক্ষর থাকে তবে আপনি মানটি একটি পূর্ণসংখ্যায় রূপান্তর করতে পারেন:

SELECT CASE WHEN <column>~E'^\\d+$' THEN CAST (<column> AS INTEGER) ELSE 0 END FROM table;

সিএএসই অপারেটর <কলাম> চেক করে, এটি যদি পূর্ণসংখ্যার প্যাটার্নের সাথে মিলে যায় তবে এটি হারকে পূর্ণসংখ্যায় রূপান্তর করে, অন্যথায় এটি 0 প্রদান করে



0

সাধারণ সমস্যা

নির্লিপ্তভাবে কোনও স্ট্রিংকে এভাবে পূর্ণসংখ্যায় কাস্টিং টাইপ করুন

SELECT ''::integer

প্রায়শই বিখ্যাত ত্রুটির ফলাফল:

Query failed: ERROR: invalid input syntax for integer: ""

সমস্যা

পোস্টগ্রিএসকিউএল নিরাপদে কোনও পূর্বনির্ধারিত ফাংশন নেই পূর্ণসংখ্যার জন্য কোনও স্ট্রিং টাইপ করার ।

সমাধান

পিএইচপি এর অন্তর্নিহিত () ফাংশন দ্বারা অনুপ্রাণিত একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন তৈরি করুন ।

CREATE FUNCTION intval(character varying) RETURNS integer AS $$

SELECT
CASE
    WHEN length(btrim(regexp_replace($1, '[^0-9]', '','g')))>0 THEN btrim(regexp_replace($1, '[^0-9]', '','g'))::integer
    ELSE 0
END AS intval;

$$
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

ব্যবহার

/* Example 1 */
SELECT intval('9000');
-- output: 9000

/* Example 2 */
SELECT intval('9gag');
-- output: 9

/* Example 3 */
SELECT intval('the quick brown fox jumps over the lazy dog');
-- output: 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.