দশমিক বিভাজক হিসাবে কমা দিয়ে স্ট্রিংয়ের সংখ্যাসূচক মানগুলিকে NUMERIC (10, 2) এ রূপান্তর করুন


12

আমার কাছে ভারচার কলামগুলির একটি এসকিউএল টেবিল রয়েছে যাতে গ্রীক বিন্যাসযুক্ত সংখ্যা রয়েছে (যেমন হাজার বিভাজক এবং দশমিক বিভাজক হিসাবে কমা)

ক্লাসিক রূপান্তর

CONVERT(numeric(10,2),REPLACE([value],',','.'))

কাজ করে না কারণ। (হাজার বিভাজক) রূপান্তরকে হত্যা করে

যেমন চেষ্টা করুন

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))

আমি এই জাতীয় মানগুলিকে সংখ্যায় রূপান্তর করতে চাই (10,2)

এটি পরিচালনা করার কোনও পরামর্শ?

উত্তর:


10

( আপনি SQL সার্ভার 2012 অথবা ঊর্ধ্বতন সংস্করণ ব্যবহার করেন তাহলে, @ wBob দেখি দয়া উত্তর একটি ক্লিনার পদ্ধতির যদি আপনি এসকিউএল সার্ভার 2008 R2 বা পুরোনো ব্যবহার করছেন। পদ্ধতির নিচে আমার উত্তর রূপরেখা শুধুমাত্র প্রয়োজন হয়। )

NUMERICকমা, কাল, বা স্থান নির্বিশেষে রূপান্তরিত করার সময় আপনার হাজার হাজার বিভাজকের দরকার নেই (বা চান) , তাই প্রথমে এগুলি থেকে মুক্তি পান। তারপরে কমাটিকে একটি পিরিয়ড / দশমিক হিসাবে রূপান্তর করুন এবং আপনার কাজ শেষ হয়েছে:

SELECT CONVERT(NUMERIC(10, 2), 
               REPLACE(
                       REPLACE('7.000,45', '.', ''),
                       ',', '.'
                      )
              ) AS [Converted];

রিটার্নস:

7000.45

সম্পূর্ণতার খাতিরে, আমার উল্লেখ করা উচিত যে আমি চেষ্টা করেছিলাম:

  • SET LANGUAGE Greek;

  • কনভার্টের জন্য বিভিন্ন ফর্ম্যাট শৈলীর দিকে তাকানো , তবে এখানে কিছুই প্রয়োগ হয় না।

  • বিন্যাসে ফাংশন, কিন্তু ইনপুট টাইপ একটি সাংখ্যিক বা তারিখ / সময় / DATETIME মান (যে এবং এটি SQL সার্ভার 2012 সালে চালু করা হয়, তাই এসকিউএল সার্ভার 2008 R2 প্রযোজ্য বা পুরোনো নয়) হতে হবে।

আর কিছুই মনে হয়নি কাজ করল। আমি দুটি REPLACEকলের চেয়ে আরও মার্জিত কিছু খুঁজে পাওয়ার আশা করছিলাম , তবে এখনও পর্যন্ত এর মতো ভাগ্য নেই।


এছাড়াও, কেবল উল্লেখ করার জন্য, খাঁটি টি-এসকিউএল সমাধান নয়, এটি এসকিউএলসিআরআরের মাধ্যমেও সম্পন্ন করা যেতে পারে। এবং, একটি প্রাক-সম্পন্ন ফাংশন রয়েছে যা এসকিউএল # লাইব্রেরিতে এটি করে (যা আমি লিখেছিলাম) স্ট্রিং_ট্রিপর্সটোডেসিমাল নামে । এই ফাংশনটি ফ্রি সংস্করণে উপলভ্য এবং এসকিউএল সার্ভারের প্রতিটি সংস্করণে এসকিউএল সার্ভার 2005 থেকে শুরু করে:

SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');

রিটার্নস:

7000.45000000000000000000

10

আপনি এসকিউএল সার্ভারের কোন সংস্করণ ব্যবহার করছেন? এসকিউএল সার্ভার ২০১২ সাল থেকে আপনি এর যুক্তি দিয়ে TRY_PARSE ব্যবহার করতে পারেন USING culture। আপনি পার্সও ব্যবহার PARSEকরতে পারেন, রূপান্তর ব্যর্থ হলে এবং পার্থক্যটি যেমন TRY_PARSEফিরে আসবে পার্থক্যটি ব্যর্থ হবেNULL

DECLARE @t TABLE ( x VARCHAR(10) )

INSERT INTO @t
VALUES ( '7.000,45' ), ( 'xxx' )

SELECT x, 
    TRY_PARSE( x AS NUMERIC(10,2) USING 'El-GR' ) x
FROM @t

পরীক্ষার ফলাফল

আছে HTH


1
আমি স্রেফ আমার উত্তরের শীর্ষে একটি নোট যুক্ত করেছি, পাঠকরা যদি এসকিউএল সার্ভার 2012 বা আরও নতুন ব্যবহার করে থাকেন তবে এখানে তাদের নির্দেশনা দিচ্ছেন।
সলোমন রুটজকি

0

নিম্নলিখিত কোডটি আমার ক্ষেত্রে কাজ করেছে:

select convert(varchar,FORMAT(123456789.0258,'###,###,###.00','de-de'))

আউটপুট: 123.456.789,03


অথবা রূপান্তর নির্বাচন করুন (বর্ণ, ফর্ম্যাট (কাস্ট (আপনার ভ্যালু সংখ্যাসূচক (10,2)), '###, ###, ###। 00', 'ডি-ডি'))
শাহেদ আদনান

2
দেখে মনে হচ্ছে আপনি ওপি যা চেয়েছিলেন তার বিপরীত সমস্যার উত্তর দিচ্ছেন। তারা সংখ্যার মানগুলিকে ফর্ম্যাট করতে চান না, তারা ফর্ম্যাট করা বর্ণের মানগুলিকে সংখ্যায় রূপান্তর করতে চান।
ypercubeᵀᴹ

1
এছাড়াও, দুই নোট: 1) সবসময় দৈর্ঘ্য উল্লেখ VARCHAR, NVARCHAR, CHAR, এবং NCHARধরনের। ডিফল্ট কোনও ক্ষেত্রে 30 এবং অন্যান্য ক্ষেত্রে 1, যা অনিবার্য / ত্রুটি-প্রবণ কোড তৈরি করে। 2) ব্যবহার করার সময় আপনার সঠিক লেআউটটির দরকার নেই ##সমস্ত অঙ্কের জন্য আপনার কেবল তাদের মধ্যে একটি (উদাঃ ) দরকার তবে হাজার হাজার বিভাজক নয়, বা তাদের দুটি সংখ্যক কমা (যেমন #,#) দ্বারা পৃথক করে সমস্ত অঙ্ক এবং কয়েক হাজার বিভাজক পেতে পারেন। সুতরাং, SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));আপনি প্রস্তাব দিচ্ছেন একই আউটপুট ফেরত দেয়।
সলোমন রুটজকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.