sql - এসকিউএল সার্ভারে নেতৃস্থানীয় শূন্য trimming জন্য ভাল কৌশল?




sql-server sql-server-2005 (9)

আমি কিছু সময়ের জন্য this ব্যবহার করা হয়েছে:

SUBSTRING(str_col, PATINDEX('%[^0]%', str_col), LEN(str_col))

যাইহোক, সম্প্রতি, আমি "00000000" মত সমস্ত "0" অক্ষরগুলির সাথে কলামগুলির সাথে একটি সমস্যা খুঁজে পেয়েছি কারণ এটি কখনও একটি অ-"0" অক্ষর মেলে না।

আমি দেখেছি একটি বিকল্প কৌশল TRIM ব্যবহার করা হয়:

REPLACE(LTRIM(REPLACE(str_col, '0', ' ')), ' ', '0')

এম্বেডেড স্পেস থাকলে এটি একটি সমস্যা রয়েছে, কারণ স্থানগুলি "0" গুলি ফিরে যাওয়ার পরে "0" গুলি রূপে পরিণত হবে।

আমি একটি scalar UDF এড়াতে চেষ্টা করছি। আমি SQL সার্ভার 2005 এ UDFs এর সাথে কর্মক্ষমতা সমস্যার অনেক খুঁজে পেয়েছি।


0 এর পরিবর্তে একটি স্থানকে 'বিরল' হোয়াইটস্পেস চরিত্র দিয়ে প্রতিস্থাপিত করে যা কলামের পাঠ্যতে সাধারণত না থাকা উচিত। একটি লাইন ফিড সম্ভবত ভালো একটি কলাম জন্য যথেষ্ট ভাল। তারপর আপনি সাধারণত LTrim করতে পারেন এবং বিশেষ চরিত্রটি 0 এর সাথে আবার প্রতিস্থাপন করতে পারেন।


অন্যান্য উত্তরগুলি যদি আপনার সমস্ত শূন্যের (অথবা এমনকি একটি শূন্য) থাকে তবে বিবেচনার জন্য এখানে নেই।
কিছু সবসময় একটি খালি স্ট্রিংকে শূন্যে ডিফল্ট করে, যখন এটি ফাঁকা থাকা উচিত বলে ভুল হয়।
মূল প্রশ্ন পুনরায় পড়তে। প্রশ্নকারীর প্রশ্নের উত্তর এই।

সমাধান # 1:

--This example uses both Leading and Trailing zero's.
--Avoid losing those Trailing zero's and converting embedded spaces into more zeros.
--I added a non-whitespace character ("_") to retain trailing zero's after calling Replace().
--Simply remove the RTrim() function call if you want to preserve trailing spaces.
--If you treat zero's and empty-strings as the same thing for your application,
--  then you may skip the Case-Statement entirely and just use CN.CleanNumber .
DECLARE @WackadooNumber VarChar(50) = ' 0 0123ABC D0 '--'000'--
SELECT WN.WackadooNumber, CN.CleanNumber,
       (CASE WHEN WN.WackadooNumber LIKE '%0%' AND CN.CleanNumber = '' THEN '0' ELSE CN.CleanNumber END)[AllowZero]
 FROM (SELECT @WackadooNumber[WackadooNumber]) AS WN
 OUTER APPLY (SELECT RTRIM(RIGHT(WN.WackadooNumber, LEN(LTRIM(REPLACE(WN.WackadooNumber + '_', '0', ' '))) - 1))[CleanNumber]) AS CN
--Result: "123ABC D0"

সমাধান # 2 (নমুনা তথ্য সহ):

SELECT O.Type, O.Value, Parsed.Value[WrongValue],
       (CASE WHEN CHARINDEX('0', T.Value)  > 0--If there's at least one zero.
              AND LEN(Parsed.Value) = 0--And the trimmed length is zero.
             THEN '0' ELSE Parsed.Value END)[FinalValue],
       (CASE WHEN CHARINDEX('0', T.Value)  > 0--If there's at least one zero.
              AND LEN(Parsed.TrimmedValue) = 0--And the trimmed length is zero.
             THEN '0' ELSE LTRIM(RTRIM(Parsed.TrimmedValue)) END)[FinalTrimmedValue]
  FROM 
  (
    VALUES ('Null', NULL), ('EmptyString', ''),
           ('Zero', '0'), ('Zero', '0000'), ('Zero', '000.000'),
           ('Spaces', '    0   A B C '), ('Number', '000123'),
           ('AlphaNum', '000ABC123'), ('NoZero', 'NoZerosHere')
  ) AS O(Type, Value)--O is for Original.
  CROSS APPLY
  ( --This Step is Optional.  Use if you also want to remove leading spaces.
    SELECT LTRIM(RTRIM(O.Value))[Value]
  ) AS T--T is for Trimmed.
  CROSS APPLY
  ( --From @CadeRoux's Post.
    SELECT SUBSTRING(O.Value, PATINDEX('%[^0]%', O.Value + '.'), LEN(O.Value))[Value],
           SUBSTRING(T.Value, PATINDEX('%[^0]%', T.Value + '.'), LEN(T.Value))[TrimmedValue]
  ) AS Parsed

ফলাফল:

সারাংশ:

শীর্ষস্থানীয়-শূন্যের এক-অফ অপসারণের জন্য আপনি যা উপরে আছেন তা ব্যবহার করতে পারেন।
যদি আপনি এটি পুনঃব্যবহারের পরিকল্পনা করেন তবে এটি একটি ইনলাইন-টেবিল-মূল্যবান-ফাংশন (আইটিভিএফ) -এ রাখুন।
UDF এর সাথে পারফরম্যান্স সমস্যাগুলির বিষয়ে আপনার উদ্বেগের বিষয়টি বোঝা যায়।
যাইহোক, এই সমস্যাটি শুধুমাত্র অল-স্কলার-ফাংশন এবং মাল্টি স্টেটমেন্ট-টেবিল-ফাংশনগুলিতে প্রযোজ্য।
আইটিভিএফ ব্যবহার করে পুরোপুরি জরিমানা।

আমার তৃতীয় পক্ষের ডাটাবেসের সাথে একই সমস্যা আছে।
আলফা-সংখ্যাসূচক ক্ষেত্রের সাথে নেতৃস্থানীয় স্পেস ছাড়া অনেক প্রবেশ করা হয়, মানুষ dang!
এই অনুপস্থিত নেতৃস্থানীয় zeros পরিষ্কার ছাড়া অসম্ভব যোগ করে তোলে।

উপসংহার:

নেতৃস্থানীয়-জিরোগুলি সরানোর পরিবর্তে, আপনি যখন যোগদান করবেন তখন আপনি নেতৃস্থানীয়-জিরোসগুলির সাথে আপনার ছাঁটাই-মানগুলি কেবল প্যাডিং বিবেচনা করতে পারেন।
আরও ভাল, শীর্ষস্থানীয় জিরো যুক্ত করে টেবিলের মধ্যে আপনার ডেটা সাফ করুন, তারপরে আপনার সূচী পুনর্নির্মাণ করুন।
আমি এই দ্রুত এবং কম জটিল উপায় হতে হবে মনে হয়।

SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF(' 0A10  ', ''))), 10)--0000000A10
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF('', ''))), 10)--NULL --When Blank.

আপনি স্নোফ্লেক এসকিউএল ব্যবহার করছেন, এই ব্যবহার করতে পারে:

ltrim(str_col,'0')

Ltrim ফাংশন বাম পাশ থেকে অক্ষরের মনোনীত সেট সব উদাহরণ মুছে ফেলা।

তাই '00000008A' এ ltrim (str_col, '0') '8A' ফিরে আসবে

এবং '125.00 ডলার' এ rtrim (str_col, '0।') '$ 125' ফিরে আসবে


এটা চেষ্টা কর:

replace(ltrim(replace(@str, '0', ' ')), ' ', '0')

এটির আমার সংস্করণটি আরভোর কাজের একটি অভিযোজন, আরও দুটি আরও নিশ্চিত করার জন্য আরও কিছু যোগ করা হয়েছে।

1) যদি আমাদের সব 0s থাকে, তাহলে আমাদের 0 নম্বরটি ফেরত দিতে হবে।

2) যদি আমাদের একটি ফাঁকা থাকে, আমরা এখনও একটি ফাঁকা অক্ষর ফিরে করা উচিত।

CASE 
    WHEN PATINDEX('%[^0]%', str_col + '.') > LEN(str_col) THEN RIGHT(str_col, 1) 
    ELSE SUBSTRING(str_col, PATINDEX('%[^0]%', str_col + '.'), LEN(str_col))
 END

কেন আপনি শুধু INTEGER এর মানটি নিক্ষেপ করবেন না এবং তারপর VARCHAR ফিরে যান?

SELECT  CAST(CAST('000000000' AS INTEGER) AS VARCHAR)

--------
       0

স্ট্রিং একটি সংখ্যা যদি কাস্ট (int হিসাবে মান) সর্বদা কাজ করবে


SELECT CAST(CAST('000000000' AS INTEGER) AS VARCHAR)

এতে স্ট্রিংয়ের দৈর্ঘ্যের সীমা রয়েছে যা একটি INT রূপান্তরিত করা যেতে পারে


replace(ltrim(replace(Fieldname.TableName, '0', '')), '', '0')

থমাস জি থেকে পরামর্শ আমাদের প্রয়োজনের জন্য কাজ করে।

আমাদের ক্ষেত্রে ক্ষেত্র ইতিমধ্যে স্ট্রিং এবং শুধুমাত্র নেতৃস্থানীয় zeros ছাঁটাই করা প্রয়োজন ছিল। বেশিরভাগই এটি সংখ্যাসূচক তবে কখনও কখনও অক্ষর থাকে তাই পূর্ববর্তী আইএনটি রূপান্তর ক্রাশ হবে।






string