टाइपकास्ट स्ट्रिंग से पूर्णांक - पोस्टग्रेज


122

मैं एक तालिका से डेटा आयात कर रहा हूं, जिसमें वर्चर्स में कच्चे फीड हैं, मुझे एक स्ट्रिंग में एक स्ट्रिंग में varchar में एक कॉलम आयात करने की आवश्यकता है। मैंने और <column_name>::integerसाथ ही उपयोग करने की कोशिश की, to_number(<column_name>,'9999999')लेकिन मुझे त्रुटियां हो रही हैं, क्योंकि कुछ खाली क्षेत्र हैं, मुझे उन्हें खाली करने या नई तालिका में रिक्त करने की आवश्यकता है।

कृपया मुझे बताएं कि क्या इसके लिए कोई फ़ंक्शन है।


5
क्या आप हमें त्रुटि संदेश दिखा सकते हैं? यह मदद करेगा
फ्रैंक Heikens

जवाबों:


125

जंगली अनुमान: यदि आपका मूल्य एक खाली स्ट्रिंग है, तो आप इसे NULLIF की जगह इसे NULL के लिए उपयोग कर सकते हैं:

SELECT
    NULLIF(your_value, '')::int

55

आप एक और आगे भी जा सकते हैं और इस तरह के coalesced क्षेत्र पर प्रतिबंधित कर सकते हैं, उदाहरण के लिए: -

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

एक ही तरीका है कि मैं NULL, या विशेष वर्ण या रिक्त स्ट्रिंग के कारण त्रुटि नहीं कर पा रहा / रही हूं:

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()दृष्टिकोण के बराबर होना चाहिए । मानक वास्तव में CASE विधेय के रूप में NULLIF को परिभाषित करता है।
कीर्तिदान

12

यदि मान में गैर-संख्यात्मक वर्ण होते हैं, तो आप मान को पूर्णांक में बदल सकते हैं:

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

CASE ऑपरेटर <कॉलम> की जाँच करता है, यदि यह पूर्णांक पैटर्न से मेल खाता है, तो यह दर को पूर्णांक में परिवर्तित करता है, अन्यथा यह 0 देता है।



0

सामान्य मुद्दा

Naively किसी भी स्ट्रिंग को पूर्णांक में टाइप करें जैसे कि

SELECT ''::integer

अक्सर प्रसिद्ध त्रुटि का परिणाम होता है:

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

संकट

किसी भी स्ट्रिंग को पूर्णांक में सुरक्षित रूप से टाइप करने के लिए PostgreSQL का कोई पूर्व-परिभाषित कार्य नहीं है ।

उपाय

PHP के intval () फ़ंक्शन से प्रेरित उपयोगकर्ता-परिभाषित फ़ंक्शन बनाएँ ।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.