নুলের সাথে এসকিউএল সার্ভার স্ট্রিং কনটেনটেশন


86

আমি ক্ষেত্রগুলি জুড়ে একটি গণিত কলাম তৈরি করছি যার কয়েকটি সম্ভাব্য শূন্য।

সমস্যাটি হ'ল যদি সেই ক্ষেত্রগুলির কোনও একটি শূন্য হয় তবে সম্পূর্ণ গণনা করা কলামটি শূন্য হবে। আমি মাইক্রোসফ্ট ডকুমেন্টেশন থেকে বুঝতে পারি যে এটি প্রত্যাশিত এবং সেটিংস SET CONCAT_NULL_YIELDS_NULL এর মাধ্যমে বন্ধ করা যেতে পারে। তবে, আমি এই ডিফল্ট আচরণটি পরিবর্তন করতে চাই না কারণ এসকিউএল সার্ভারের অন্যান্য অংশে এর প্রভাবগুলি আমি জানি না।

আমার পক্ষে কি কেবল কোনও কলামটি শূন্য রয়েছে কিনা তা পরীক্ষা করার কোনও উপায় আছে এবং কেবল এটির শংসাপত্রগুলি যদি গণনা করা কলামের সূত্রের মধ্যে শূন্য হয় না তবে এটি যুক্ত করে?


4
প্রশ্নটি জিজ্ঞাসা করা সময়ে গ্রহণযোগ্য উত্তরটি ঠিক তখনই ছিল তবে এসকিউএল সার্ভার ২০১২ এবং তার পরে প্রত্যেকের জন্য (এবং এই পর্যায়ে যে প্রত্যেকেরই হওয়া উচিত) @ মার্টিন-স্মিথস উত্তরটি স্বয়ংক্রিয়ভাবে নাল পরিচালনা করার কারণে সেরা।
দোলাররা

উত্তর:


144

তুমি ব্যবহার করতে পার ISNULL(....)

SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')

যদি কলাম / এক্সপ্রেশনটির মানটি সত্যই নুল হয় তবে তার পরিবর্তে নির্দিষ্ট দ্বিতীয় মান (এখানে: খালি স্ট্রিং) ব্যবহৃত হবে।


23
"কোলেসেস" হ'ল এএনএসআই-স্ট্যান্ডার্ড ফাংশন নাম, তবে ইসনুল বানান সহজ।
ফিলিপ কেলি

4
এবং এসএনএল সার্ভারে আইএসএনএলএলটি খুব দ্রুত একটি বাচ্চা বলে মনে হচ্ছে - সুতরাং আপনি যদি এটি কোনও গণনা কলামে স্ট্রিংগুলি সংযুক্ত করে এমন কোনও ফাংশনে ব্যবহার করতে চান তবে আপনি এএনএসআই স্ট্যান্ডার্ডকে ছেড়ে গতি অর্জন করতে পারেন (অ্যাডাম মাচানিক: sqlblog.com দেখুন / ব্লগস / অ্যাডাম_ম্যাচনিক / সংরক্ষণাগার / 2006/07/12 /… )
মার্ক_স

কেবল এই ইসনুল (,) ক্যোয়ারীটি ব্যবহার করেছেন, এটি অনেকটা হিপ হয়েছে কারণ আমি একসাথে মানগুলি একত্রিত করেছিলাম এবং যদি সেগুলির মধ্যে একটি শূন্য হয় তবে সবকিছুও নাল হয়ে যায়।
সিজনস

ব্যবহার ISNULL()করা একটি ভাল সমাধান তবে এসকিউএল সার্ভার ২০১২ থেকে, আপনি CONCATএকই ফল পেতে ফাংশনটিও ব্যবহার করতে পারেন :CONCAT(@Column1, @Column2)
মুহাম্মদ মুসাভি

4
এখানে লক্ষ যে আপনি যদি অদলবদল করতে চান মূল্য nullএকটি খালি স্ট্রিং ছাড়া অন্য কিছু, অর্থাত জন্য IsNull(@Column1, 'NULLVALUE'), সঙ্গে IsNull, প্রতিস্থাপন স্ট্রিং দৈর্ঘ্য কলাম প্রতিস্থাপন হচ্ছে দৈর্ঘ্য সীমাবদ্ধ যখন এটি দিয়ে নয়Coalesce
জেমি

59

এসকিউএল সার্ভার থেকে 2012 CONCATফাংশনটি সহ এটি অনেক সহজ ।

এটি NULLখালি স্ট্রিং হিসাবে আচরণ করে

DECLARE @Column1 VARCHAR(50) = 'Foo',
        @Column2 VARCHAR(50) = NULL,
        @Column3 VARCHAR(50) = 'Bar';


SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/

পুরানো সংস্করণগুলির জন্য আপনি "'কনক্যাট' কোনও স্বীকৃত অন্তর্নির্মিত ফাংশন নাম নয়", তাই COALESCE ব্যবহার করুন
সেভেজ

4
@ সাভেজ - কলেসেস কাজ করবে না কারণ এটি মিলিত হয় না, এটি কেবল প্রথম নাল যুক্তিটি ফিরিয়ে দেয়
কোডুলিকে


12

ব্যবহার

SET CONCAT_NULL_YIELDS_NULL  OFF 

এবং একটি স্ট্রিংতে নাল মানকে যুক্ত করে তোলার ফলে নাল হয় না।

দয়া করে মনে রাখবেন যে এটি একটি অবহেলিত বিকল্প, ব্যবহার এড়াতে। আরও বিশদ জন্য ডকুমেন্টেশন দেখুন ।


11

আপনি সিএসইও ব্যবহার করতে পারেন - নীচের আমার কোডটি নাল মান এবং খালি দুটি স্ট্রিং উভয়ের জন্য যাচাই করে, এবং অনুসরণ করার কোনও মান থাকে তবেই একটি পৃথককে যুক্ত করুন:

SELECT OrganisationName, 
'Address' = 
CASE WHEN Addr1 IS NULL OR Addr1 = '' THEN '' ELSE Addr1 END + 
CASE WHEN Addr2 IS NULL OR Addr2 = '' THEN '' ELSE ', ' + Addr2 END + 
CASE WHEN Addr3 IS NULL OR Addr3 = '' THEN '' ELSE ', ' + Addr3 END + 
CASE WHEN County IS NULL OR County = '' THEN '' ELSE ', ' + County END 
FROM Organisations 

8

ক্ষেত্রটি কিনা তা নির্ভর করে কেউ যদি স্ট্রিংয়ের মধ্যে বিভাজক যুক্ত করার জন্য সাহায্যের সন্ধান করে তবে আমি এইটিকে অবদান রাখতে চেয়েছিলাম NUL

সুতরাং পৃথক ক্ষেত্রগুলি থেকে একটি লাইন ঠিকানা তৈরির উদাহরণে

Address1 , Address2 , Address3 , সিটি , পোস্টকোড

আমার ক্ষেত্রে আমার কাছে নিম্নলিখিত গণিত কলাম রয়েছে যা মনে হচ্ছে এটি কাজ করছে বলে মনে হচ্ছে:

case 
    when [Address1] IS NOT NULL 
    then (((          [Address1]      + 
          isnull(', '+[Address2],'')) +
          isnull(', '+[Address3],'')) +
          isnull(', '+[City]    ,'')) +
          isnull(', '+[PostCode],'')  
end

আশা করি যে কাউকে সাহায্য করবে!


এখানে রিডানড্যান্ট নেস্টেড ব্র্যাককেটিংয়ের বেশ কিছুটা রয়েছে যা সরানো যেতে পারে। অন্য টিপটি হ'ল আপনি কেস স্টেটমেন্টটিও মুছে ফেলতে পারেন যেন ঠিকানা 1 নাল হওয়ায় পুরো এক্সপ্রেশনটি নালার কাছে মূল্যায়ন করবে (যদিও কেস স্টেটমেন্ট থাকলে মনোযোগ আকর্ষণ করে যে এটি ঘটতে পারে)
অল্টারনেটার


1

এ নিয়ে আমারও অনেক সমস্যা হয়েছিল। উপরের কেস উদাহরণগুলি ব্যবহার করে এটি কাজ করতে পারেনি, তবে এটি আমার জন্য কাজ করে:

Replace(rtrim(ltrim(ISNULL(Flat_no, '') + 
' ' + ISNULL(House_no, '') + 
' ' + ISNULL(Street, '') + 
' ' + ISNULL(Town, '') + 
' ' + ISNULL(City, ''))),'  ',' ')

প্রতিস্থাপন একক স্পেসকে তাদের মধ্যে কিছুই না করে সংশ্লেষের ফলে দ্বিগুণ স্থান সংশোধন করে। r / ltrim প্রান্তে যে কোনও স্থান থেকে মুক্তি পেয়ে যায়।


0

স্কেল সার্ভারে:

insert into Table_Name(PersonName,PersonEmail) values(NULL,'xyz@xyz.com')

PersonName is varchar(50), NULL is not a string, because we are not passing with in single codes, so it treat as NULL.

পিছনে কোড:

string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'";
string email = txtEmail.Text;

insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"')

0

Exampleোকানো বিবৃতি তৈরি করার সময় এই উদাহরণটি আপনাকে বিভিন্ন ধরণের পরিচালনা করতে সহায়তা করবে

select 
'insert into doc(Id, CDate, Str, Code, Price, Tag )' + 
'values(' +
      '''' + convert(nvarchar(50), Id) + ''',' -- uniqueidentifier
    + '''' + LEFT(CONVERT(VARCHAR, CDate, 120), 10) + ''',' -- date
    + '''' + Str+ ''',' -- string
    + '''' + convert(nvarchar(50), Code)  + ''',' -- int
    + convert(nvarchar(50), Price) + ',' -- decimal
    + '''' + ISNULL(Tag, '''''') + '''' + ')'  -- nullable string

 from doc
 where CDate> '2019-01-01 00:00:00.000'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.