স্থান সহ একটি কলামে বিশেষ অক্ষরগুলি প্রতিস্থাপন করুন


10

আমি একটি ক্যোয়ারী লেখার চেষ্টা করছি যা স্পেসের সাথে বিশেষ অক্ষরের পরিবর্তে। নীচের কোডটি সারিগুলি সনাক্ত করতে সহায়তা করে। (আলফা-সংখ্যাসূচক অক্ষর, কমা এবং স্থান বৈধ):

SELECT columnA
FROM tableA
WHERE columnA like '%[^a-Z0-9, ]%'

আমি কীভাবে নির্বাচিত বিবৃতিতে প্রতিস্থাপন ফাংশনকে সংহত করতে পারি যাতে ফলস্বরূপ বর্ণানুক্রমিক, কমা এবং স্থান ব্যতীত সমস্ত অক্ষর '' (স্পেস) দ্বারা প্রতিস্থাপিত হয়। এই এক কাজ করবে না:

SELECT replace(columnA,'%[^a-Z0-9, ]%',' ')
FROM tableA
WHERE columnA like '%[^a-Z0-9, ]%'

উত্তর:


11

আপনি যদি কেবলমাত্র ইউএস ইংলিশ বর্ণমালার 26 টি অক্ষর (উচ্চতর ক্ষেত্রে এবং লোয়ার-কেস সংস্করণ উভয়ই) ব্যবহার করার গ্যারান্টিযুক্ত হন তবে নিশ্চিত হন যে আপনি ব্যবহার করে LIKEএবং / অথবা PATINDEXসরল পরিসরের স্বরলিপি দিয়ে [a-z](আপনি না কেস-সংবেদনশীল কোলেশন ব্যবহার করার সময় একটি উচ্চ-केस "জেড" ব্যবহার করা দরকার) to

কিন্তু, যদি আপনি স্বীকারোক্তি-মার্কিন মধ্যে পাওয়া অক্ষর পেতে পারে জন্য বিভিন্ন কোড পেজ / Collations এখনো উপলব্ধ বর্ণমালা VARCHARতথ্য (উদাঃ Þ= ল্যাটিন বড় হাতের "কণ্টকময়" = SELECT CHAR(0xDE)), তারপর আপনি অক্ষর শ্রেণিতে যারা অন্তর্ভুক্ত করতে হবে পারে: [a-z0-9, Þ]। অবশ্যই, এই অতিরিক্ত অক্ষরগুলি কী হবে তা প্রতি কোড পৃষ্ঠা ভিত্তিতে।

এছাড়াও, দয়া করে সচেতন হন যে উভয় কোলেশন প্রকার (এসকিউএল সার্ভার বনাম উইন্ডোজ) এবং সংবেদনশীলতা সেটিংস (কেস, অ্যাকসেন্ট, ইত্যাদি সংবেদনশীল বনাম সংবেদনশীল) কোনও অক্ষরে কোন অক্ষরের অন্তর্ভুক্ত রয়েছে তা প্রভাবিত করবে। উদাহরণস্বরূপ, এসকিউএল সার্ভার কলেশনগুলি উইন্ডোজ কোলিশেশন হিসাবে বিপরীত ক্রমে উচ্চ-কেস এবং লোয়ার-কেস অক্ষরগুলিকে সাজান। অর্থ, উভয় ধরণের কোলিশের ক্ষেত্রে কেস-সেনসিটিভ কোলেশন ধরে নেওয়া, একজন করবে AaBb...এবং অন্যটি করবে aAbB...। প্রভাবটি সেগুলির aমধ্যে A-Zএকটির সীমার মধ্যে থাকবে তবে অন্যটির নয়। এবং এর পরিসীমা a-Zবাইনারি কোলেশনের কোনও অক্ষরের সাথে মেলে না (একটিতে শেষ হয় _BINবা _BIN2, কিন্তু ব্যবহার করবেন না _BIN) প্রদত্ত মানটি A65 এবংa97, সুতরাং এটি 65 ;-) এর মাধ্যমে 97 এর একটি অবৈধ পরিসীমা। এখানে উদাহরণ দেওয়ার জন্য অনেক বিচিত্রতা রয়েছে তাই আমি খুব শীঘ্রই আমার ব্লগে একটি বিস্তারিত ব্যাখ্যা পোস্ট করার চেষ্টা করব (এবং তারপরে এটির লিঙ্কটি আপডেট করব)। তবে, আপনি যদি কেবল মার্কিন ইংরেজী অক্ষর গ্রহণের বিষয়ে কঠোর হতে চলেছেন (এমনকি অন্য ভাষা থেকে বৈধ অক্ষর পেতেও পারে) তবে আপনার সর্বোত্তম বিকল্পটি সম্ভবত নিম্নলিখিত প্যাটার্ন এবং কোলেশন ব্যবহার করা হবে :

LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2

এখন, আপনি যদি NVARCHARডেটা সমর্থন করছেন এবং বিভিন্ন ভাষা থেকে "শব্দ" অক্ষর পেতে পারেন, তবে টি-এসকিউএল খুব বেশি সহায়ক হবে না কারণ এই জিনিসগুলির মধ্যে পার্থক্য করার কোনও সত্যিকারের উপায় নেই। এই ক্ষেত্রে, আপনার একটি নিয়মিত এক্সপ্রেশন (RegEx) ব্যবহার করা উচিত - বিশেষত Replaceপদ্ধতি / ফাংশন - এবং সেগুলি কেবল এসকিউএলসিআরআর এর মাধ্যমে উপলব্ধ। নিম্নলিখিতটিতে বেশ কয়েকটি "বিশেষ" অক্ষর প্রতিস্থাপনের একটি উদাহরণ দেখানো হয়েছে, যা বৈধ অক্ষরের সাথে অন্তত একটি ভাষায় রেখে দেয়:

DECLARE @Test NVARCHAR(500);
SET @Test = N'this$is%a<>TEST,;to}⌡↕strip╞╟╚══¶out_ç_ƒ▀ special-ij-೫-chars-舛-დ-א-B';
SELECT SQL#.RegEx_Replace4k(@Test, N'[\W\p{Pc}-[,]]', N' ', -1, 1, NULL); 

রিটার্নস:

this is a  TEST, to   strip      out ç ƒ  special ij ೫ chars 舛 დ א B

রেজিএক্স এক্সপ্রেশনটির অর্থ:

  • \W= একটি Regex "এস্কেপ" যার অর্থ "কোনো -word চরিত্র"
  • \p{Pc}= "বিরামচিহ্ন, সংযোগকারী" এর একটি ইউনিকোড "বিভাগ" (এটি কেবল ম্যাচের জন্য প্রয়োজন কারণ এই "বিভাগ "টি বিশেষত \Wপালানোর দ্বারা বাদ দেওয়া হয়েছে )
  • -[,]= বর্গ বিয়োগ (এগুলি \Wপালানোর ক্ষেত্রে অন্তর্ভুক্ত হওয়ায় কমাগুলি "বিশেষ" হিসাবে মিলিয়ে বাদ দেওয়ার জন্য এটি প্রয়োজন )

আপনি কেবল জারি করে কোনও টেবিলের আপডেট করতে পারেন:

UPDATE tbl
SET    tbl.field = SQL#.RegEx_Replace4k(tbl.field, N'[\W\p{Pc}-[,]]', N' ', -1, 1, NULL)
FROM   tbl
WHERE  SQL#.RegEx_IsMatch4k(tbl.field, N'[\W\p{Pc}-[,]]', 1, NULL) = 1;

দয়া করে মনে রাখবেন যে এই উদাহরণগুলির জন্য, আমি এসকিউএলসিআরআর ফাংশনগুলির ফ্রি সংস্করণ এসকিউএল # লাইব্রেরিতে উপলব্ধ দুটি ফাংশন ব্যবহার করেছি , যা আমি তৈরি করেছি (তবে আবার এগুলি নিখরচায়)। এছাড়াও নোট করুন যে আমি "4k" সংস্করণগুলি ব্যবহার করেছি NVARCHAR(4000)যা NVARCHAR(MAX)প্যারামিটার ধরণের পরিবর্তে ব্যবহারের কারণে দ্রুত হয় । যদি আপনার ডেটা ব্যবহার করা হয় NVARCHAR(MAX), তবে কেবলমাত্র ফাংশনটির নামগুলি থেকে "4k" সরান।

দয়া করে দেখুন:


5

আমি এখানে একটি পোস্ট পেয়েছি যা অনুরূপ কিছু করে

মূলত আমি একবারে একটি "খারাপ" চরিত্রের পরিবর্তে বার বার লুপ করতে পুনরাবৃত্ত সিটিই ব্যবহার করছি। আমি মুছে ফেলার জন্য যে চরিত্রটি সরাতে চাই তার অবস্থানের জন্য আমি 1 টি অক্ষর (যদিও আপনি এটি কোনও স্থানের সাথে প্রতিস্থাপন করতে ব্যবহার করতে পারেন) এবং প্যাটিনডেক্স ব্যবহার করছি U আপনি যা খুঁজছেন তা করতে আপনি এটি সামান্য পরিবর্তন করতে পারেন। তবে এটি একটি "ভাল" তালিকা তৈরি করে, এটি আসলে বিদ্যমান তালিকাকে আপডেট করে না।

DECLARE @Pattern varchar(50) = '%[^A-Za-z0-9, ]%';

WITH FixBadChars AS (SELECT StringToFix, StringToFix AS FixedString, 1 AS MyCounter, Id
                FROM BadStringList
                UNION ALL
                SELECT StringToFix, Stuff(FixedString, PatIndex(@Pattern, 
                    FixedString COLLATE Latin1_General_BIN2), 1, ' ') AS FixedString, 
                    MyCounter + 1, Id
                FROM FixBadChars
                WHERE FixedString COLLATE Latin1_General_BIN2 LIKE @Pattern)
SELECT StringToFix, FixedString, MyCounter, Id
FROM FixBadChars
WHERE MyCounter = 
        (SELECT MAX(MyCounter) 
        FROM FixBadChars Fixed
        WHERE Fixed.Id = FixBadChars.Id)
OPTION (MAXRECURSION 1000);

আপনার কেবল নীচের অংশটি পরিবর্তনের জন্য কেবলমাত্র কোনও ক্যোয়ারির পরিবর্তে আপডেট করার জন্য সক্ষম হওয়া উচিত তবে আমি আসলে এটি চেষ্টা করি নি। আমি মোটামুটি নিশ্চিত যে এটি দেখতে এরকম কিছু দেখাবে:

UPDATE FixBadChars
SET StringToFix = FixedString
WHERE MyCounter = 
        (SELECT MAX(MyCounter) 
        FROM FixBadChars Fixed
        WHERE Fixed.Id = FixBadChars.Id)
OPTION (MAXRECURSION 1000);

যতদূর পর্যন্ত স্কেলিবিলিটি হিসাবে আমি 30 সেকেন্ডের নীচে 170 ডলার সাফ সারিগুলি ফিরিয়ে দিয়েছি। আবার কোনও আপডেট করার বিষয়ে নিশ্চিত নয় তবে এটি আমার ল্যাপটপে ছিল যা কেবলমাত্র 6 জিবি র‌্যামের সাথে মোটামুটি ধীর।


0
Declare @String nchar(2000)='hg$%^AB,.:23ab-=+'

Declare @NewString VARCHAR(2000)=''
Declare @Lenght int=LEN(@String)
Declare @Index int=1

WHILE (@Index <= @Lenght)
BEGIN
    Declare @Letter nchar(1)=Substring(@String,@Index,1);
    Declare @ASCII int=ASCII(@Letter);
    If((@ASCII >= 48 and @ASCII <= 57) or (@ASCII >= 97 and @ASCII <= 122) or (@ASCII >= 65 and @ASCII <= 90))
    BEGIN
        SET @NewString += @Letter
    END
    ELSE
    BEGIN
        SET @NewString += ' '
    END
    SET @Index+=1

END
Select @NewString
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.