Oracle में बिल्ट-इन TRIM
. है तार के लिए कार्य। मान लें कि आपके पास एक स्ट्रिंग है जैसे '00012345'
और आप इसे एक स्ट्रिंग के रूप में रखना चाहते हैं, इसे वास्तविक NUMBER
. में परिवर्तित नहीं करना चाहते हैं , आप LTRIM
. का उपयोग कर सकते हैं वैकल्पिक दूसरे set
. के साथ कार्य करें पैरामीटर यह निर्दिष्ट करता है कि आप शून्य को ट्रिम कर रहे हैं:
select ltrim('000012345', '0') from dual;
LTRIM
-----
12345
यदि आपके पास प्रमुख स्थान भी हो सकते हैं तो आप दोनों को एक ही बार में ट्रिम कर सकते हैं:
select ltrim(' 00012345', '0 ') from dual;
LTRIM
-----
12345
आप एक नंबर और बैक में भी कनवर्ट कर सकते हैं, लेकिन यह बहुत काम की तरह लगता है जब तक कि आपके पास अन्य फ़ॉर्मेटिंग न हो जिसे आप अलग करना चाहते हैं:
select to_char(to_number('000012345')) from dual;
संयोग से, आपको अपने पहले प्रयास से ORA-01722 प्राप्त होने का तात्कालिक कारण यह है कि आप संख्यात्मक +
का उपयोग कर रहे हैं Oracle के स्ट्रिंग सांद्रता ऑपरेटर के बजाय ऑपरेटर ||
. यह आपकी स्ट्रिंग का एक संख्या में एक अंतर्निहित रूपांतरण कर रहा है, ऐसा लगता है कि आप बचने की कोशिश कर रहे हैं, और एकल स्थान का अंतर्निहित रूपांतरण - जो कुछ भी है - त्रुटि उत्पन्न कर रहा है। (संभवतः आपके कुछ मान, वास्तव में, संख्याएं ही नहीं हैं - संख्याओं को NUMBER
में क्यों संग्रहीत किया जाना चाहिए, इसका एक अन्य उदाहरण खेत; और अगर ऐसा है तो एक नंबर और बैक में कनवर्ट करना (या कास्टिंग) अभी भी ओआरए-01722 प्राप्त करेगा)। यदि आप LENGTH
. का उपयोग कर रहे थे तो आपको दूसरे प्रयास में वही चीज़ मिलेगी LEN
. के बजाय . वैसे भी INSTR
. के रूप में काम नहीं करेगा नियमित अभिव्यक्तियों को नहीं पहचानता है। आप REGEXP_INSTR
का उपयोग कर सकते हैं इसके बजाय, लेकिन आप @schurik के REGEXP_REPLACE
के साथ बेहतर होंगे संस्करण यदि आप उस मार्ग से नीचे जाना चाहते हैं।
मुझे यकीन नहीं है कि मैं आपके प्रश्न संपादन को समझता हूं। ऐसा लगता है कि आपके इंसर्ट को सरल बनाया जा सकता है:
INSERT INTO temp_table (columnNeedTrim, column2, column3, column4, column5)
SELECT LTRIM(table1.columnNeedTrim, '0 '),
table1.column2,
table1.column3,
table1.column4,
table1.column5
FROM table1
INNER JOIN table2 ON table2.columnNeedTrim = table1.columnNeedTrim
WHERE NOT EXISTS (
SELECT * FROM temp_table
WHERE columnNeedTrim = LTRIM(t42.columnNeedTrim, '0 '));
(मुझे समझ नहीं आ रहा है कि आप अपने संस्करण में सबक्वायरी क्यों कर रहे हैं, या आपको दूसरे से ट्रिम किया गया मान क्यों मिल रहा है सबक्वेरी।)
आप MERGE
. का भी उपयोग कर सकते हैं :
MERGE INTO temp_table tt
USING (
SELECT LTRIM(t42.columnNeedTrim, '0 ') AS columnNeedTrim,
t42.column2,
t42.column3,
t42.column4,
t42.column5
FROM t42
INNER JOIN t43 ON t43.columnNeedTrim=t42.columnNeedTrim
) sr
ON (sr.columnNeedTrim = tt.columnNeedTrim)
WHEN NOT MATCHED THEN
INSERT (tt.columnNeedTrim, tt.column2, tt.column3, tt.column4, tt.column5)
VALUES (sr.columnNeedTrim, sr.column2, sr.column3, sr.column4, sr.column5);