এই প্রশ্ন একটি স্ট্রিং বিভক্ত পদ্ধতির সম্পর্কে না , কিন্তু সম্পর্কে কিভাবে n তম উপাদান পেতে ।
এখানে সমস্ত উত্তর পুনরাবৃত্তি ব্যবহার করে কিছু ধরণের স্ট্রিং বিভক্ত করছে, CTE
গুলি, একাধিক CHARINDEX
, REVERSE
এবং PATINDEX
, উদ্ভাবন ফাংশন, CLR পদ্ধতি, সংখ্যা টেবিল, আহ্বান CROSS APPLY
s ... সর্বাধিক উত্তর কোডের অনেক লাইন আবরণ।
তবে - যদি আপনি সত্যিই নবম এলিমেন্টটি পাওয়ার পদ্ধতির চেয়ে আরও কিছু চান না - এটি বাস্তব ওয়ান-লাইনার হিসাবে , কোনও ইউডিএফ, এমনকি উপ-নির্বাচন হিসাবেও করা যায় না ... এবং অতিরিক্ত সুবিধা হিসাবে: নিরাপদ টাইপ করুন
একটি স্থান দ্বারা সীমানা অংশ 2 পান:
DECLARE @input NVARCHAR(100)=N'part1 part2 part3';
SELECT CAST(N'<x>' + REPLACE(@input,N' ',N'</x><x>') + N'</x>' AS XML).value('/x[2]','nvarchar(max)')
অবশ্যই আপনি ডিলিমিটার এবং অবস্থানের জন্য ভেরিয়েবলগুলি ব্যবহার করতে পারেন (ব্যবহার করুন)sql:column
কোনও প্রশ্নের মান থেকে সরাসরি অবস্থানটি পুনরুদ্ধার করতে ):
DECLARE @dlmt NVARCHAR(10)=N' ';
DECLARE @pos INT = 2;
SELECT CAST(N'<x>' + REPLACE(@input,@dlmt,N'</x><x>') + N'</x>' AS XML).value('/x[sql:variable("@pos")][1]','nvarchar(max)')
যদি আপনার স্ট্রিংয়ে নিষিদ্ধ অক্ষরগুলি (বিশেষত একটির মধ্যে একটি &><
) অন্তর্ভুক্ত থাকে তবে আপনি এখনও এইভাবে এটি করতে পারেন। FOR XML PATH
প্রথমে আপনার স্ট্রিংয়ের মধ্যে সমস্ত নিষিদ্ধ অক্ষরকে পুরোপুরি ফিট করার ক্রমটি প্রতিস্থাপন করতে ব্যবহার করুন।
এটি অতিরিক্ত বিশেষ ক্ষেত্রে যদি - অতিরিক্তভাবে - আপনার ডিলিমিটারটি সেমিকোলন হয় । এই ক্ষেত্রে আমি প্রথমে ডিলিমিটারটি '# DLMT #' এ প্রতিস্থাপন করব এবং শেষ পর্যন্ত এটি এক্সএমএল ট্যাগগুলিতে প্রতিস্থাপন করব:
SET @input=N'Some <, > and &;Other äöü@€;One more';
SET @dlmt=N';';
SELECT CAST(N'<x>' + REPLACE((SELECT REPLACE(@input,@dlmt,'#DLMT#') AS [*] FOR XML PATH('')),N'#DLMT#',N'</x><x>') + N'</x>' AS XML).value('/x[sql:variable("@pos")][1]','nvarchar(max)');
এসকিউএল-সার্ভার 2016+ এর জন্য আপডেট
দুঃখের সাথে বিকাশকারীরা অংশটির সূচকটি দিয়ে ফিরে যেতে ভুলে গেছেন STRING_SPLIT
। তবে, এসকিউএল-সার্ভার 2016+ ব্যবহার করে রয়েছেJSON_VALUE
এবং রয়েছে OPENJSON
।
সঙ্গে JSON_VALUE
আমরা সূচকের অ্যারে হিসাবে অবস্থানে যেতে পারি।
জন্য ডকুমেন্টেশনOPENJSON
স্পষ্টভাবে বলে:
যখন ওপেনজসন একটি জেএসওএন অ্যারে পার্স করে, ফাংশনটি জেএসএন পাঠ্যের উপাদানগুলির সূচিগুলি কী হিসাবে দেয়।
মত একটি পংক্তি 1,2,3
বন্ধনী চেয়ে বেশি চাহিদা কিছুই: [1,2,3]
।
মত শব্দ একটি স্ট্রিং this is an example
চাহিদা হতে ["this","is","an","example"]
।
এগুলি খুব সহজ স্ট্রিং অপারেশন। এটি চেষ্টা করে দেখুন:
DECLARE @str VARCHAR(100)='Hello John Smith';
DECLARE @position INT = 2;
--We can build the json-path '$[1]' using CONCAT
SELECT JSON_VALUE('["' + REPLACE(@str,' ','","') + '"]',CONCAT('$[',@position-1,']'));
- নিরাপদ স্ট্রিং-স্প্লিটার ( শূন্য-ভিত্তিক ) এর জন্য এটি দেখুন:
SELECT JsonArray.[key] AS [Position]
,JsonArray.[value] AS [Part]
FROM OPENJSON('["' + REPLACE(@str,' ','","') + '"]') JsonArray
ইন এই পোস্টে আমি বিভিন্ন পন্থা পরীক্ষিত দেখলেন, যেOPENJSON
সত্যিই দ্রুত। বিখ্যাত "ডিলিমিটেডস্প্লিট 8 কে ()" পদ্ধতির চেয়ে অনেক দ্রুত ...
আপডেট 2 - মান টাইপ-নিরাপদ পান
দ্বিগুণ ব্যবহার করে আমরা একটি অ্যারের মধ্যে একটি অ্যারের ব্যবহার করতে পারি [[]]
। এটি টাইপড WITH
ক্লাউজগুলির জন্য অনুমতি দেয় :
DECLARE @SomeDelimitedString VARCHAR(100)='part1|1|20190920';
DECLARE @JsonArray NVARCHAR(MAX)=CONCAT('[["',REPLACE(@SomeDelimitedString,'|','","'),'"]]');
SELECT @SomeDelimitedString AS TheOriginal
,@JsonArray AS TransformedToJSON
,ValuesFromTheArray.*
FROM OPENJSON(@JsonArray)
WITH(TheFirstFragment VARCHAR(100) '$[0]'
,TheSecondFragment INT '$[1]'
,TheThirdFragment DATE '$[2]') ValuesFromTheArray