কিছুটা সরাসরি সরাসরি উপস্থিতি নির্বাচন করা কি সম্ভব?


185

আমি ভাবছিলাম যে এরকম কিছু করা সম্ভব (যা কাজ করে না):

select cast( (exists(select * from theTable where theColumn like 'theValue%') as bit)

দেখে মনে হচ্ছে এটি করণীয় হওয়া উচিত, তবে এসকিউএল এ প্রচুর জিনিস ব্যবহার করা উচিত নয়;) আমি এর জন্য কাজের ক্ষেত্র দেখেছি (নির্বাচন করুন 1 যেখানে ... বিদ্যমান ...) তবে মনে হচ্ছে আমার ঠিক সক্ষম হওয়া উচিত বিদ্যমান ফাংশনটির ফলাফলটি কিছুটা ফেলে দিন এবং এটি দিয়েই করুন।

উত্তর:


267

না, আপনাকে একটি কঠোর ব্যবহার করতে হবে।

যদি আপনাকে শর্তসাপেক্ষে বিট 0/1 ফেরত পাঠাতে হয় তবে অন্য কোনও উপায় হ'ল:

SELECT CAST(
   CASE WHEN EXISTS(SELECT * FROM theTable where theColumn like 'theValue%') THEN 1 
   ELSE 0 
   END 
AS BIT)

বা castালাই ছাড়াই:

SELECT
   CASE
       WHEN EXISTS( SELECT 1 FROM theTable WHERE theColumn LIKE 'theValue%' )
            THEN 1 
       ELSE 0 
   END

16
যদি আপনি ফলাফলটি কোনও বিট ডেটাটাইপে সংরক্ষণ করে থাকেন তবে আপনার theালাইয়ের দরকার নেই কারণ কাস্ট ইতিমধ্যে অন্তর্ভুক্ত।
মাইকটাইভি

3
এই কৌশলটি স্রেফ পরীক্ষিত, দুর্দান্ত কাজ করে। বিএসআইটি থেকে বিআইটি-তে এসকিউএল সার্ভার ২০০৮ আর 2 দিয়ে পরীক্ষিত কোয়েরি থেকে ফলাফলগুলি পুনরুদ্ধার করার প্রয়োজন নেই।
টোর অরস্টাদ

আমার ক্ষেত্রে
নিক্ষেপটি

50
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

আপনি যখন বিট কাস্ট

  • 0 -> 0
  • অন্য সব কিছুই -> 1
  • এবং NULL -> অবশ্যই নুল, তবে আপনি কোনও গ্রুপ দ্বারা গ্রাহ ব্যতীত COUNT (*) এর সাথে NULL পেতে পারবেন না

bit সরাসরি মানচিত্র boolean নেট নেট ডেটাটাইপগুলিতে , এমনকি যদি এটি সত্যই না হয় ...

এটি দেখতে অনুরূপ তবে কোনও মিল না থাকলে (শূন্য নয়) কোনও সারি দেয় না, সুতরাং এটি একই রকম নয়

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'

4
তবে এটি মোটেও বিদ্যমান ব্যবহার করে না। আমি এটি জিজ্ঞাসা করছিলাম না যে এটি কীভাবে কার্যকরী করা যায়, আমি কার্যনির্বাহী সন্ধান করতে পারি, আমি জিজ্ঞাসা করছিলাম যে আমি কিছুটা অবগত ছিলাম না এমনটি ব্যবহার করার কিছু কৌশল আছে কিনা?
jcollum

6
এটি কোনও কর্মক্ষেত্র নয়, এটি এক সঠিক উপায় নির্ধারিত wise উপস্থিতি কি এই কাজ ... এবং খুব পরিষ্কার, না?
gbn

1
@ জ্যাকলাম: হ্যাঁ, বা এই জাতীয় কিছু। অস্তিত্ব প্রায় সর্বদা উপস্থিত থাকলে বা যেখানে উপস্থিত থাকে এবং আউটপুট যেমন আপনি করার চেষ্টা করছেন তেমন ব্যবহার করা হয় না
gbn

14
রেকর্ডের অস্তিত্বের জন্য যাচাই করার সময় উপস্থিতিগুলি COUNT এর চেয়ে বেশি দক্ষ - দেখুন স্ক্যালব্লগ.ব্লাগস
তাহির হাসান

9
বিপরীতে EXISTS, COUNTপ্রথমটি সন্ধান করার পরেও সারিগুলির সাথে মিল রেখে ডেটা সন্ধান করতে থাকবে কারণ এটির গণনা করা দরকার।
ইসমাইলস

11

আমি এর জন্য আপটাকে কিছুটা দেরি করছি; শুধু পোস্ট জুড়ে হোঁচট খেয়েছে। তবে এখানে একটি সমাধান যা নির্বাচিত উত্তরের চেয়ে বেশি দক্ষ এবং ঝরঝরে, তবে একই কার্যকারিতা দেওয়া উচিত:

declare @t table (name nvarchar(16))
declare @b bit

insert @t select N'Simon Byorg' union select N'Roe Bott'


select @b = isnull((select top 1 1 from @t where name = N'Simon Byorg'),0)
select @b whenTrue

select @b = isnull((select top 1 1 from @t where name = N'Anne Droid'),0)
select @b whenFalse

7

আপনি ব্যবহার করতে পারেন IIFএবংCAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
                       where theColumn like 'theValue%'), 1, 0) AS BIT)

1
আমি এটি পছন্দ করি তবে এটি কেবল এসকিউএল সার্ভারে কাজ করে 2012 এবং তার বেশি। দেখে মনে হচ্ছে IIF যোগ হয়েছিল 2012
ja928

4

আপনি নিম্নলিখিতগুলি করতে পারেন:

SELECT DISTINCT 1
  FROM theTable
 WHERE theColumn LIKE 'theValue%'

যদি 'theValue' দিয়ে কোনও মান শুরু না হয় তবে এটি 0 টির পরিবর্তে শূন্য (কোনও রেকর্ড নেই) ফিরিয়ে দেবে


2

না এটা সম্ভব নয়। বিট ডেটা টাইপ কোনও বুলিয়ান ডেটা টাইপ নয়। এটি একটি পূর্ণসংখ্যা ডেটা টাইপ যা 0,1 বা NULL হতে পারে।


3
@bzlm হ্যাঁ এটি এসকিউএল সার্ভারে 10 বছরেরও বেশি সময় ধরে থাকতে পারে। এসকিউএল সার্ভার .0.০
মার্টিন স্মিথ

4
@ বিজেএলএম - মনে হচ্ছে আপনি স্ট্রোতে আটকে আছেন এবং এসকিউএল সার্ভারের ডেটা ধরণের সম্পর্কে সত্যই আমার কাছে কিছুই জানেন না। এসকিউএল সার্ভারে বিটের সংজ্ঞাটি হল "একটি পূর্ণসংখ্যা ডেটা টাইপ যা 1, 0 বা NULL এর মান নিতে পারে।" এমএসডিএন.মাইক্রোসফট.এইন.উস / লিবারি /ms177603.aspx । এটি কলাম এবং লেনদেন এসকিউএল ভেরিয়েবলগুলিতে প্রযোজ্য। কোথাও এসকিউএল-তে বুলিয়ান হিসাবে কিছুটা ভেরিয়েবল ব্যবহার করা যায় IF(@TRUE)না বা এর বিপরীতে কোনও বুলিয়ান এক্সপ্রেশনকে কিছুটা জোর করা যায়। (উদাঃ সহ SET @BitVariable = (1=1))
মার্টিন স্মিথ

1
আপনি কোথায় যাচ্ছেন তা আমি দেখতে পাচ্ছি, তবে কাস্টিং বিট করার বিষয়টি এতটা ছিল না যে সরাসরি উপস্থিতি বাছাই করতে সক্ষম হওয়ায়।
jcollum

1

আরেকটি সমাধান ব্যবহার করা ISNULLটমটম SELECT TOP 1 1:

SELECT ISNULL((SELECT TOP 1 1 FROM theTable where theColumn like 'theValue%'), 0)

-1

আমি বিশ্বাস করি যে বিদ্যমানটি কেবলমাত্র যেখানে ক্লজ ব্যবহার করা যেতে পারে, তাই আপনাকে একটি কাজ করতে হবে (বা যেখানে সাবজেক্ট রয়েছে যেখানে ক্লজ হিসাবে উপস্থিত রয়েছে)। আমি জানি না যে এটি গণনা হিসাবে গণনা করে।

এই সম্পর্কে কি:

create table table1 (col1   int null)
go
select 'no items',CONVERT(bit, (select COUNT(*) from table1) )   -- returns 'no items', 0
go
insert into table1 (col1) values (1)
go
select '1 item',CONVERT(bit, (select COUNT(*) from table1) )     --returns '1 item', 1
go
insert into table1 (col1) values (2)
go
select '2 items',CONVERT(bit, (select COUNT(*) from table1) )    --returns '2 items', 1
go
insert into table1 (col1) values (3)
go
drop table table1
go

একটি নির্বাচন যখন ক্ষেত্রে সম্পর্কে কি?
লোয়ারকি

-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.