তিনটি সারি সহ একটি ডাটাবেস টেবিলের নাম বিবেচনা করুন:
Peter
Paul
Mary
এটিকে একক স্ট্রিংয়ে রূপান্তর করার কোন সহজ উপায় আছে Peter, Paul, Mary
?
তিনটি সারি সহ একটি ডাটাবেস টেবিলের নাম বিবেচনা করুন:
Peter
Paul
Mary
এটিকে একক স্ট্রিংয়ে রূপান্তর করার কোন সহজ উপায় আছে Peter, Paul, Mary
?
উত্তর:
আপনি যদি এসকিউএল সার্ভার 2017 বা অ্যাজুরে থাকেন তবে ম্যাথিউ রেন্ডার উত্তর দেখুন ।
যখন আমি একের সাথে বহু সম্পর্কের সাথে দুটি টেবিলের সাথে যোগ দেওয়ার চেষ্টা করছিলাম তখন আমার একই রকম সমস্যা হয়েছিল। এসকিউএল 2005-এ আমি আবিষ্কার করেছি যে XML PATH
পদ্ধতিটি খুব সহজেই সারিগুলির সংমিশ্রণ পরিচালনা করতে পারে।
যদি একটি টেবিল বলা হয় STUDENTS
SubjectID StudentName
---------- -------------
1 Mary
1 John
1 Sam
2 Alaina
2 Edward
আমি প্রত্যাশিত ফলাফলটি ছিল:
SubjectID StudentName
---------- -------------
1 Mary, John, Sam
2 Alaina, Edward
আমি নিম্নলিখিত ব্যবহার T-SQL
:
SELECT Main.SubjectID,
LEFT(Main.Students,Len(Main.Students)-1) As "Students"
FROM
(
SELECT DISTINCT ST2.SubjectID,
(
SELECT ST1.StudentName + ',' AS [text()]
FROM dbo.Students ST1
WHERE ST1.SubjectID = ST2.SubjectID
ORDER BY ST1.SubjectID
FOR XML PATH ('')
) [Students]
FROM dbo.Students ST2
) [Main]
আপনি একই জিনিসটি আরও কমপ্যাক্ট উপায়ে করতে পারেন যদি আপনি শুরুতে কমাগুলিকে একত্রে করতে পারেন এবং substring
প্রথমটি এড়িয়ে যেতে ব্যবহার করেন যাতে আপনার সাব-কোয়েরি করতে হবে না:
SELECT DISTINCT ST2.SubjectID,
SUBSTRING(
(
SELECT ','+ST1.StudentName AS [text()]
FROM dbo.Students ST1
WHERE ST1.SubjectID = ST2.SubjectID
ORDER BY ST1.SubjectID
FOR XML PATH ('')
), 2, 1000) [Students]
FROM dbo.Students ST2
<
বা &
। @ বেনহিনম্যানের মন্তব্য দেখুন।
FOR XML PATH ('')
। এর অর্থ এটি কোনও নির্ভরযোগ্য হিসাবে বিবেচিত হবে না কারণ কোনও প্যাচ বা আপডেট কীভাবে এই কার্য সম্পাদন করতে পারে তা পরিবর্তন করতে পারে। এটি মূলত একটি অবহ্রাসিত বৈশিষ্ট্যের উপর নির্ভর করে।
FOR XML
এক্সএমএল তৈরির উদ্দেশ্যে করা হয়েছে, স্বেচ্ছাসেবী স্ট্রিংগুলিকে একত্রিত করতে নয়। কেন পালাতে এর &
, <
এবং >
এক্সএমএল সত্তা কোডগুলির ( &
, <
, >
)। আমি অনুমান এটি অব্যাহতি হবে "
এবং '
করতে "
এবং '
গুণের হিসাবে ভাল। এটা না GROUP_CONCAT()
, string_agg()
, array_agg()
, listagg()
, ইত্যাদি আপনি করতে ধরনের এটা তা করতে পারে এমনকি যদি। আমরা উচিত মাইক্রোসফট একটি সঠিক ফাংশন বাস্তবায়ন দাবিতে আমাদের সময় কাটানোর হবে না।
string_agg
v.Next এ যুক্ত হবে । এবং এই সব দূরে যেতে পারে।
এই উত্তরটি অপ্রত্যাশিত ফলাফলগুলিতে ফিরে আসতে পারে ধারাবাহিক ফলাফলের জন্য, অন্যান্য উত্তরে বিশদ জন্য এক্সএমএল পথের একটি পদ্ধতি ব্যবহার করুন।
ব্যবহার COALESCE
:
DECLARE @Names VARCHAR(8000)
SELECT @Names = COALESCE(@Names + ', ', '') + Name
FROM People
কেবলমাত্র কিছু ব্যাখ্যা (যেহেতু এই উত্তরটি তুলনামূলকভাবে নিয়মিত মতামত পেয়েছে):
1) @Names
খালি স্ট্রিংয়ের মান দিয়ে আরম্ভ করার দরকার নেই ।
2) শেষে কোনও অতিরিক্ত বিভাজক ছিটকে যাওয়ার দরকার নেই।
@Names
DECLARE @Names VARCHAR(8000)
SELECT @Names = COALESCE(@Names + ', ', '') + Name
FROM People
WHERE Name IS NOT NULL
বা:
DECLARE @Names VARCHAR(8000)
SELECT @Names = COALESCE(@Names + ', ', '') +
ISNULL(Name, 'N/A')
FROM People
আপনি কী আচরণ চান তার উপর নির্ভর করে (প্রথম বিকল্পটি কেবল NUL গুলি ফিল্টার করে, দ্বিতীয় বিকল্পটি তাদেরকে একটি চিহ্নিতকারী বার্তা সহ তালিকায় রাখে [আপনার উপযুক্ত কিছুর সাথে 'এন / এ' প্রতিস্থাপন করুন])।
এসকিউএল সার্ভারের পরবর্তী সংস্করণ দিয়ে শুরু করে, আমরা শেষ পর্যন্ত কোনও ভেরিয়েবল বা এক্সএমএল উইচরি অবলম্বন না করে সারিগুলি জুড়ে একত্রিত করতে পারি।
গ্রুপিং ছাড়াই
SELECT STRING_AGG(Name, ', ') AS Departments
FROM HumanResources.Department;
দলবদ্ধকরণ সহ:
SELECT GroupName, STRING_AGG(Name, ', ') AS Departments
FROM HumanResources.Department
GROUP BY GroupName;
দলবদ্ধকরণ এবং উপ-বাছাইয়ের সাথে
SELECT GroupName, STRING_AGG(Name, ', ') WITHIN GROUP (ORDER BY Name ASC) AS Departments
FROM HumanResources.Department
GROUP BY GroupName;
XML
data()
এমএস এসকিউএল সার্ভারের কমান্ডের মাধ্যমে এখনও একটি পদ্ধতি প্রদর্শন করা হয়নি :
এফমন নামক একটি কলাম সহ নাম তালিকাভুক্ত নামক টেবিলটি ধরে নিন,
SELECT FName + ', ' AS 'data()'
FROM NameList
FOR XML PATH('')
আয়:
"Peter, Paul, Mary, "
কেবলমাত্র অতিরিক্ত কমা নিয়ে কাজ করতে হবে।
সম্পাদনা করুন: @ এনআরিলিংহের মন্তব্য থেকে গৃহীত হিসাবে, আপনি অনুগামী কমাটি অপসারণ করতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন। একই টেবিল এবং কলামের নাম ধরে নিচ্ছি:
STUFF(REPLACE((SELECT '#!' + LTRIM(RTRIM(FName)) AS 'data()' FROM NameList
FOR XML PATH('')),' #!',', '), 1, 2, '') as Brands
+ ', '
এটি প্রতিটি সংক্ষিপ্ত উপাদানগুলির মধ্যে একটি একক স্থান যুক্ত করে।
SELECT STUFF(REPLACE((SELECT '#!'+city AS 'data()' FROM #cityzip FOR XML PATH ('')),' #!',', '),1,2,'')
SELECT Stuff(
(SELECT N', ' + Name FROM Names FOR XML PATH(''),TYPE)
.value('text()[1]','nvarchar(max)'),1,2,N'')
আপনি ব্যবহার করতে পারেন JSON সিনট্যাক্স
অর্থাত
SELECT per.ID,
Emails = JSON_VALUE(
REPLACE(
(SELECT _ = em.Email FROM Email em WHERE em.Person = per.ID FOR JSON PATH)
,'"},{"_":"',', '),'$[0]._'
)
FROM Person per
এবং ফলাফল হয়ে যাবে
Id Emails
1 abc@gmail.com
2 NULL
3 def@gmail.com, xyz@gmail.com
এটি এমনকি আপনার ডেটাতে অবৈধ এক্সএমএল অক্ষরগুলিও কাজ করবে
'"},{"_":"'
নিরাপদ কারন যদি আপনি ডাটা ধারণ '"},{"_":"',
এটি পলান করা হবে"},{\"_\":\"
আপনি যে ', '
কোনও স্ট্রিং বিভাজকের সাথে প্রতিস্থাপন করতে পারেন
আপনি নতুন STRING_AGG ফাংশনটি ব্যবহার করতে পারেন
<
, >
, &
, ইত্যাদি যা FOR XML PATH('')
স্বয়ংক্রিয়ভাবে অব্যাহতি হবে।
মাইএসকিউএলে একটি ফাংশন রয়েছে, GROUP_CONCAT () , যা আপনাকে একাধিক সারি থেকে মানগুলি সংযুক্ত করতে দেয় allows উদাহরণ:
SELECT 1 AS a, GROUP_CONCAT(name ORDER BY name ASC SEPARATOR ', ') AS people
FROM users
WHERE id IN (1,2,3)
GROUP BY a
SEPARATOR '", "'
করব তখন আমি সর্বশেষ প্রবেশের শেষে কিছু অক্ষর মিস করব। কেন এমন হতে পারে?
CHAR
, আপনি এটি নিক্ষেপ করা প্রয়োজন, যেমন মাধ্যমে GROUP_CONCAT( CAST(id AS CHAR(8)) ORDER BY id ASC SEPARATOR ',')
2) যদি আপনি অনেক মান আসছে আছে, তবে আপনি বৃদ্ধি করা উচিত group_concat_max_len
যেমন লেখা stackoverflow.com/a/1278210/1498405
COALESCE ব্যবহার করুন - এখান থেকে আরও জানুন
উদাহরণস্বরূপ:
102
103
104
তারপরে স্ক্যালি সার্ভারে কোডের নিচে লিখুন,
Declare @Numbers AS Nvarchar(MAX) -- It must not be MAX if you have few numbers
SELECT @Numbers = COALESCE(@Numbers + ',', '') + Number
FROM TableName where Number IS NOT NULL
SELECT @Numbers
আউটপুট হবে:
102,103,104
Declare @Numbers AS Nvarchar(MAX)
এবং এটি ভাল কাজ করেছে। আপনি দয়া করে কেন এটি ব্যবহার না করার পরামর্শ দিচ্ছেন?
পোস্টগ্রিস অ্যারে দুর্দান্ত। উদাহরণ:
কিছু পরীক্ষার ডেটা তৈরি করুন:
postgres=# \c test
You are now connected to database "test" as user "hgimenez".
test=# create table names (name text);
CREATE TABLE
test=# insert into names (name) values ('Peter'), ('Paul'), ('Mary');
INSERT 0 3
test=# select * from names;
name
-------
Peter
Paul
Mary
(3 rows)
একটি অ্যারে তাদের সমষ্টি:
test=# select array_agg(name) from names;
array_agg
-------------------
{Peter,Paul,Mary}
(1 row)
অ্যারেটি কমা বিস্মৃত স্ট্রিংয়ে রূপান্তর করুন:
test=# select array_to_string(array_agg(name), ', ') from names;
array_to_string
-------------------
Peter, Paul, Mary
(1 row)
সম্পন্ন
PostgreSQL 9.0 যেহেতু এটি আরও সহজ ।
select array_to_string(array_agg(name||'('||id||')'
ওরাকল 11 জি রিলিজ 2, লিস্ট্যাগ ফাংশন সমর্থন করে। ডকুমেন্টেশন এখানে ।
COLUMN employees FORMAT A50
SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;
DEPTNO EMPLOYEES
---------- --------------------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
3 rows selected.
ফলস্বরূপ স্ট্রিং 4000 টির বেশি অক্ষরের বেশি যাওয়ার সম্ভাবনা থাকলে এই ফাংশনটি বাস্তবায়নে সতর্ক হন। এটি ব্যতিক্রম ছুঁড়ে ফেলবে। যদি এটি হয় তবে আপনার ব্যতিক্রমটি পরিচালনা করতে হবে বা আপনার নিজের ফাংশনটি রোল করা উচিত যা যুক্ত হওয়া স্ট্রিংকে 4000 টির বেশি অক্ষরের উপরে যেতে বাধা দেয়।
LISTAGG
নিখুঁত কাজ করে! এখানে লিঙ্কযুক্ত দস্তাবেজটি কেবল পড়ুন। wm_concat
12c সংস্করণ থেকে অপসারণ করা হয়েছে।
এসকিউএল সার্ভার 2005 এবং তারপরে, সারিগুলিকে একত্রিত করতে নীচের ক্যোয়ারীটি ব্যবহার করুন।
DECLARE @t table
(
Id int,
Name varchar(10)
)
INSERT INTO @t
SELECT 1,'a' UNION ALL
SELECT 1,'b' UNION ALL
SELECT 2,'c' UNION ALL
SELECT 2,'d'
SELECT ID,
stuff(
(
SELECT ','+ [Name] FROM @t WHERE Id = t.Id FOR XML PATH('')
),1,1,'')
FROM (SELECT DISTINCT ID FROM @t ) t
<
বা &
।
বাড়িতে আমার এসকিউএল সার্ভারের অ্যাক্সেস নেই, সুতরাং আমি অনুমান করছি যে এখানে বাক্য গঠনটি রয়েছে তবে এটি কমবেশি:
DECLARE @names VARCHAR(500)
SELECT @names = @names + ' ' + Name
FROM Names
SELECT @names = @names + CASE WHEN LEN(@names)=0 THEN '' ELSE ' ' END + Name FROM Names
SELECT @names = @names + ISNULL(' ' + Name, '')
একটি পুনরাবৃত্ত সিটিই সমাধান প্রস্তাব দেওয়া হয়েছিল, কিন্তু কোনও কোড সরবরাহ করা হয়নি। নীচের কোডটি একটি পুনরাবৃত্ত সিটিইর উদাহরণ। মনে রাখবেন যে ফলাফল প্রশ্নের সাথে মেলে, তথ্যের সাথে বর্ণিত বর্ণনার সাথে বেশ কিছু মেলে না , কারণ আমি ধরে নিয়েছি যে আপনি টেবিলের সমস্ত সারি নয়, সারিগুলির দলগুলিতে এই কাজটি করতে চান। টেবিলের সমস্ত সারি মিলে এটি পরিবর্তন করা পাঠকের অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে।
;WITH basetable AS (
SELECT
id,
CAST(name AS VARCHAR(MAX)) name,
ROW_NUMBER() OVER (Partition BY id ORDER BY seq) rw,
COUNT(*) OVER (Partition BY id) recs
FROM (VALUES
(1, 'Johnny', 1),
(1, 'M', 2),
(2, 'Bill', 1),
(2, 'S.', 4),
(2, 'Preston', 5),
(2, 'Esq.', 6),
(3, 'Ted', 1),
(3, 'Theodore', 2),
(3, 'Logan', 3),
(4, 'Peter', 1),
(4, 'Paul', 2),
(4, 'Mary', 3)
) g (id, name, seq)
),
rCTE AS (
SELECT recs, id, name, rw
FROM basetable
WHERE rw = 1
UNION ALL
SELECT b.recs, r.ID, r.name +', '+ b.name name, r.rw + 1
FROM basetable b
INNER JOIN rCTE r ON b.id = r.id AND b.rw = r.rw + 1
)
SELECT name
FROM rCTE
WHERE recs = rw AND ID=4
name
4 কমা দ্বারা পৃথক করা স্ট্রিং মধ্যে কলাম গ্রুপ এর id
সে। প্রথম নজরে, আমি মনে করি এটি এসকিউএল সার্ভারের জন্য সর্বাধিক অন্যান্য সমাধানগুলির চেয়ে বেশি কাজ।
PostgreSQL 9.0 দিয়ে শুরু করা এটি বেশ সহজ:
select string_agg(name, ',')
from names;
9.0 এর আগের সংস্করণগুলিতে array_agg()
hgmnz দ্বারা প্রদর্শিত হিসাবে ব্যবহার করা যেতে পারে
SELECT string_agg(non_text_type::text, ',') FROM table
varchar
বাchar
এসকিউএল সার্ভারে vNext এ STRING_AGG ফাংশনটি দিয়ে নির্মিত হবে, এ সম্পর্কে এখানে আরও পড়ুন: https://msdn.microsoft.com/en-us/library/mt790580.aspx
এক্সএমএল ব্যবহার করে সারিগুলি কমা দিয়ে আলাদা করতে সহায়তা করেছিল। অতিরিক্ত কমা জন্য আমরা এসকিউএল সার্ভারের প্রতিস্থাপন ফাংশনটি ব্যবহার করতে পারি। কমা যুক্ত করার পরিবর্তে, এএস 'ডেটা ()' এর ব্যবহারটি সারিগুলিকে ফাঁকা স্থানের সাথে একত্রিত করবে, যা পরে নীচের লিখিত সিনট্যাক্স হিসাবে কমা দ্বারা প্রতিস্থাপন করা যেতে পারে।
REPLACE(
(select FName AS 'data()' from NameList for xml path(''))
, ' ', ', ')
কোনও অতিরিক্ত কমা ছাড়াই ব্যবহারের জন্য প্রস্তুত সমাধান:
select substring(
(select ', '+Name AS 'data()' from Names for xml path(''))
,3, 255) as "MyList"
একটি খালি তালিকা ফলাফলের ফলাফল করবে। সাধারণত আপনি তালিকাটি একটি টেবিল কলাম বা প্রোগ্রাম ভেরিয়েবলের মধ্যে সন্নিবেশ করান: আপনার প্রয়োজনের সাথে 255 সর্বোচ্চ দৈর্ঘ্য সামঞ্জস্য করুন।
(দিবাকর এবং জেনস ফ্রেন্ডসেন ভাল উত্তর সরবরাহ করেছেন, তবে উন্নতির প্রয়োজন))
', '
সঙ্গে ','
যদি আপনি অতিরিক্ত স্থান চাই না।
SELECT STUFF((SELECT ', ' + name FROM [table] FOR XML PATH('')), 1, 2, '')
একটি নমুনা এখানে:
DECLARE @t TABLE (name VARCHAR(10))
INSERT INTO @t VALUES ('Peter'), ('Paul'), ('Mary')
SELECT STUFF((SELECT ', ' + name FROM @t FOR XML PATH('')), 1, 2, '')
--Peter, Paul, Mary
DECLARE @Names VARCHAR(8000)
SELECT @name = ''
SELECT @Names = @Names + ',' + Names FROM People
SELECT SUBSTRING(2, @Names, 7998)
এটি শুরুতে বিপথগামী কমা রাখে।
তবে, আপনার যদি অন্য কলামগুলির প্রয়োজন হয় বা সিএসভিতে কোনও শিশু টেবিলের দরকার হয় তবে এটিকে একটি স্কেলার ব্যবহারকারী সংজ্ঞায়িত ক্ষেত্রে (ইউডিএফ) মোড়ানো দরকার।
আপনিও নির্বাচন বিভাগে প্রাসঙ্গিক সাবকিউরি হিসাবে এক্সএমএল পাথটি ব্যবহার করতে পারেন (তবে গুগল ঘরে বসে স্টাফ না করায় আমাকে আবার কাজ করা পর্যন্ত অপেক্ষা করতে হবে :-)
অন্যান্য উত্তরের সাথে, উত্তরটি পড়ছেন এমন ব্যক্তিকে অবশ্যই একটি নির্দিষ্ট ডোমেন টেবিল যেমন যানবাহন বা শিক্ষার্থী সম্পর্কে সচেতন হতে হবে। কোনও সমাধান পরীক্ষা করার জন্য টেবিলটি অবশ্যই ডেটা দিয়ে তৈরি এবং পপুলেট করা উচিত।
নীচে একটি উদাহরণ রয়েছে যা এসকিউএল সার্ভার "ইনফরমেশন_শেমা.কলামগুলি" সারণী ব্যবহার করে। এই সমাধানটি ব্যবহার করে কোনও টেবিল তৈরি বা ডেটা যুক্ত করার দরকার নেই। এই উদাহরণটি ডাটাবেসের সমস্ত সারণীর জন্য কমা নামের পৃথক কলামের নামের তালিকা তৈরি করে।
SELECT
Table_Name
,STUFF((
SELECT ',' + Column_Name
FROM INFORMATION_SCHEMA.Columns Columns
WHERE Tables.Table_Name = Columns.Table_Name
ORDER BY Column_Name
FOR XML PATH ('')), 1, 1, ''
)Columns
FROM INFORMATION_SCHEMA.Columns Tables
GROUP BY TABLE_NAME
ওরাকল ডিবি-র জন্য, এই প্রশ্নটি দেখুন: কীভাবে একাধিক সারি একটি সঞ্চিত প্রক্রিয়া তৈরি না করে ওরাকলিতে একটিতে সংযুক্ত করা যায়?
ওরাকল 11 জি রিলিজ 2 এবং এর পরে উপলব্ধ বিল্ট-ইন লিস্টাগজি () ফাংশনটি ব্যবহার করে @ এমমানুয়েল দ্বারা সেরা উত্তরটি উপস্থিত হতে পারে।
SELECT question_id,
LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE;
GROUP BY question_id
@ ব্যবহারকারী 76292952 হিসাবে উল্লেখ করা হয়েছে, এবং ওরাকল এর ডকুমেন্টেশন অনুযায়ী http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php , ডাব্লুএম_কনক্যাট () ফাংশনও একটি বিকল্প। এটি স্থিতিশীল বলে মনে হয়, তবে ওরাকল স্পষ্টভাবে কোনও অ্যাপ্লিকেশন এসকিউএল এর জন্য এটি ব্যবহার করার বিরুদ্ধে সুপারিশ করে, তাই আপনার নিজের ঝুঁকিতে ব্যবহার করুন।
তা ছাড়া আপনার নিজের ফাংশনটি লিখতে হবে; উপরের ওরাকল নথিতে এটি কীভাবে করা যায় সে সম্পর্কে একটি গাইড রয়েছে।
নাল মান এড়ানোর জন্য আপনি কনক্যাট () ব্যবহার করতে পারেন
DECLARE @names VARCHAR(500)
SELECT @names = CONCAT(@names, ' ', name)
FROM Names
select @names
আমি ডানার উত্তরটির কমনীয়তা পছন্দ করেছি । শুধু এটি সম্পূর্ণ করতে চেয়েছিলেন।
DECLARE @names VARCHAR(MAX)
SET @names = ''
SELECT @names = @names + ', ' + Name FROM Names
-- Deleting last two symbols (', ')
SET @sSql = LEFT(@sSql, LEN(@sSql) - 1)
SELECT @names = @names + CASE WHEN LEN(@names)=0 THEN '' ELSE ', ' END + Name FROM Names
ফেলুন আপনাকে পরে এটি কেটে ফেলতে হবে না।
এই উত্তরের জন্য সার্ভারে কাজ করার জন্য কিছু সুযোগ সুবিধা প্রয়োজন।
সমাবেশগুলি আপনার জন্য একটি ভাল বিকল্প। এখানে অনেকগুলি সাইট রয়েছে যা এটি কীভাবে তৈরি করা যায় তা ব্যাখ্যা করে। এক আমি মনে করি খুব ভাল ব্যাখ্যা করা হয় এই হল এক
আপনি যদি চান তবে আমি ইতিমধ্যে সমাবেশ তৈরি করেছি এবং এখানে ডিএলএল ডাউনলোড করা সম্ভব ।
একবার এটি ডাউনলোড হয়ে গেলে আপনার এসকিউএল সার্ভারে আপনাকে নিম্নলিখিত স্ক্রিপ্টটি চালাতে হবে:
CREATE Assembly concat_assembly
AUTHORIZATION dbo
FROM '<PATH TO Concat.dll IN SERVER>'
WITH PERMISSION_SET = SAFE;
GO
CREATE AGGREGATE dbo.concat (
@Value NVARCHAR(MAX)
, @Delimiter NVARCHAR(4000)
) RETURNS NVARCHAR(MAX)
EXTERNAL Name concat_assembly.[Concat.Concat];
GO
sp_configure 'clr enabled', 1;
RECONFIGURE
লক্ষ্য করুন যে সমাবেশে যাওয়ার পথটি সার্ভারে অ্যাক্সেসযোগ্য হতে পারে। যেহেতু আপনি সফলভাবে সমস্ত পদক্ষেপগুলি সম্পন্ন করেছেন, আপনি ফাংশনটি ব্যবহার করতে পারেন যেমন:
SELECT dbo.Concat(field1, ',')
FROM Table1
আশা করি এটা সাহায্য করবে!!!
মাইএসকিউএল সম্পূর্ণ উদাহরণ:
আমাদের এমন ব্যবহারকারী রয়েছে যার অনেকগুলি ডেটা থাকতে পারে এবং আমরা একটি আউটপুট পেতে চাই, যেখানে আমরা সমস্ত ব্যবহারকারীর একটি তালিকাতে ডেটা দেখতে পাব:
ফলাফল:
___________________________
| id | rowList |
|-------------------------|
| 0 | 6, 9 |
| 1 | 1,2,3,4,5,7,8,1 |
|_________________________|
সারণী সেটআপ:
CREATE TABLE `Data` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
INSERT INTO `Data` (`id`, `user_id`) VALUES
(1, 1),
(2, 1),
(3, 1),
(4, 1),
(5, 1),
(6, 0),
(7, 1),
(8, 1),
(9, 0),
(10, 1);
CREATE TABLE `User` (
`id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `User` (`id`) VALUES
(0),
(1);
প্রশ্ন:
SELECT User.id, GROUP_CONCAT(Data.id ORDER BY Data.id) AS rowList FROM User LEFT JOIN Data ON User.id = Data.user_id GROUP BY User.id
আমি সাধারণত এসকিউএল সার্ভারে স্ট্রিংগুলি সংহত করতে এই জাতীয় নির্বাচন ব্যবহার করি:
with lines as
(
select
row_number() over(order by id) id, -- id is a line id
line -- line of text.
from
source -- line source
),
result_lines as
(
select
id,
cast(line as nvarchar(max)) line
from
lines
where
id = 1
union all
select
l.id,
cast(r.line + N', ' + l.line as nvarchar(max))
from
lines l
inner join
result_lines r
on
l.id = r.id + 1
)
select top 1
line
from
result_lines
order by
id desc
এটি আমার জন্য কাজ করেছে ( স্কিল সার্ভার 2016 ):
SELECT CarNamesString = STUFF((
SELECT ',' + [Name]
FROM tbl_cars
FOR XML PATH('')
), 1, 1, '')
উত্সটি এখানে: https://www.mytecbit.com/
এবং মাইএসকিএল এর সমাধান (যেহেতু এই পৃষ্ঠাটি মাইএসকিএল এর জন্য গুগলে প্রদর্শিত হচ্ছে)
SELECT [Name],
GROUP_CONCAT(DISTINCT [Name] SEPARATOR ',')
FROM tbl_cars
ওরাকলে, এটি হয় wm_concat
। আমি বিশ্বাস করি যে এই ফাংশনটি 10 জি রিলিজ এবং এর থেকেও বেশি উপলভ্য ।
এটিও কার্যকর হতে পারে
create table #test (id int,name varchar(10))
--use separate inserts on older versions of SQL Server
insert into #test values (1,'Peter'), (1,'Paul'), (1,'Mary'), (2,'Alex'), (3,'Jack')
DECLARE @t VARCHAR(255)
SELECT @t = ISNULL(@t + ',' + name, name) FROM #test WHERE id = 1
select @t
drop table #test
আয়
Peter,Paul,Mary