মাইক্রোসফ্ট টিএসকিউএলে কোনও সারি পাওয়া না গেলে কোনও মান ফিরিয়ে দিন


97

এসকিউএল এর একটি মাইক্রোসফ্ট সংস্করণ ব্যবহার করে , এখানে আমার সহজ জিজ্ঞাসা। যদি আমি এমন কোনও রেকর্ড জিজ্ঞাসা করি যা বিদ্যমান নেই তবে আমি কিছুই ফেরত পাব না। আমি পছন্দ করি যে সেই পরিস্থিতিতে মিথ্যা (0) ফিরিয়ে দেওয়া হবে। কোনও রেকর্ডের জন্য অ্যাকাউন্ট না দেওয়ার সহজ পদ্ধতির সন্ধান করছেন।

SELECT  CASE
            WHEN S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1) THEN 1
            ELSE 0
        END AS [Value]

        FROM Sites S

        WHERE S.Id = @SiteId

উত্তর:


67
SELECT CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END AS [Value]

FROM Sites S

WHERE S.Id = @SiteId and S.Status = 1 AND 
      (S.WebUserId = @WebUserId OR S.AllowUploads = 1)

কোয়েরির নীচে অন্য অবস্থায় একক মান প্রদান করে তবে আদর্শভাবে এটি একাধিক মান ফেরত দেয়। গণনা করার সময় কেস নির্বাচন করুন (QTIB_REQ _) <1 তারপরে 0 আর QTIB_REQ_ qb_requisitions_ শেষে যেখানে QTIB_REQ_ IN (q Req_disabled_WA) এবং CLIENT___BENCH___NON_BILLALE not IN ('বিলেবল নয়', 'নন-বিলেবল', 'নন-বিলেবল), এসসি ক্লিয়ারিজ স্ট্র্যাটেজিক হায়ারস ',' বেঞ্চ / ইউএস প্রকল্প ') এবং ডেটেডিএফএফ (সিকিউরিটি (), টার্গেT_FILL_DATE) <60 এবং ডেটেডিএফ (সিকিউরিটি (), টার্গেT_FILL_DATE)> 0
প্রণীত বাহাদুর

128

এটি অ্যাডাম রবিনসনের মতো, তবে এটি COUNT এর পরিবর্তে ISNULL ব্যবহার করে।

SELECT ISNULL(
(SELECT 1 FROM Sites S
WHERE S.Id = @SiteId and S.Status = 1 AND 
      (S.WebUserId = @WebUserId OR S.AllowUploads = 1)), 0)

যদি অভ্যন্তরীণ ক্যোয়ারির কোনও মিল থাকে তবে সারণী 1 হয়। বাহ্যিক ক্যোয়ারী (ISNULL সহ) এর পরে এই মানটি 1 প্রদান করে the বাহ্যিক ক্যোয়ারী এটি একটি NULL এর মতো আচরণ করে এবং তাই ইসনুল 0 এ ফিরে আসে।


4
এটি যোগ করার জন্য আপনাকে ধন্যবাদ! এটি ঠিক আমার যা প্রয়োজন, ঠিক তেমনই আমি নির্বাচন করতে পারতাম না (কেবল অনুসন্ধানের জন্য আইডি নির্বাচন করুন ... আমি যে ডেটা খুঁজছিলাম তা পাওয়ার জন্য!
জেসি স্মিথ

4
খুব দেরীতে, আমি জানি, তবে আপনি একই ফলাফলটি অর্জনের জন্য CONLESCE দিয়ে ISNULL প্রতিস্থাপন করতে পারেন।
ব্লু চিপ্পি

4
আমি ISNULL এর চেয়ে COALESCE ব্যবহার করার অভ্যাসে পড়েছি কারণ মেমরি থেকে (অভ্যাসগুলি কঠোরভাবে মারা যায়), এসএসকিউএল লাইটে বা এটি যাকে বলা হয় এটি পুরানো উইন্ডোজ মোবাইল ডিভাইসে চালিত হয় না IS COALESCE, লাইট, এক্সপ্রেস এবং পূর্ণ-বিকাশযুক্ত এসকিউএল উভয় ক্ষেত্রেই কাজ করে।
বিজ্ঞাপন

4
এটি 0 বা 1 এর পরিবর্তে ভেরিয়েবলের মান পেতে চাইলে এটি আরও ভাল কাজ করে Adam অ্যাডামের ক্যোয়ারিতে গ্রুপিং বা এর মতো কিছু দরকার।
ড্রাক

@ মাইসিসকো আমি পছন্দ করি যে এটি 0 টি শূন্য হলে কীভাবে ফেরত দেয় তবে 1 টি ফেরার পরিবর্তে আমি কীভাবে টেবিল থেকে মানটি ফিরিয়ে আনতে পারি?
মাইকেল

21

এটি একটি মৃত ঘোড়া হতে পারে, 1 সারি ফিরে আসার আর একটি উপায় নেই যখন কোনও সারি নেই UN

SELECT S.Status, COUNT(s.id) AS StatusCount
FROM Sites S
WHERE S.Id = @SiteId
GROUP BY s.Status
UNION ALL --UNION BACK ON TABLE WITH NOT EXISTS
SELECT 'N/A' AS Status, 0 AS StatusCount
WHERE NOT EXISTS (SELECT 1
   FROM Sites S
   WHERE S.Id = @SiteId
) 

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

4
যদি এটি 2 টি সারি ফেরত দেয় তবে এটি কি নিশ্চিত যে সারিগুলি প্রত্যাশিত ক্রমে ফিরে আসবে?
সার্সাপরিলা

এবং কার্যকর করার পরিকল্পনায় এটি ভারী
Fandango68

12

কিছুটা এইরকম:

if exists (select top 1 * from Sites S where S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1))
    select 1
else
    select 0

আমি এই সমাধানটি ব্যবহার করলাম কারণ এটি আমার কাছে আরও জ্ঞান লাভ করে (আমি প্রচলিতভাবে এসকিউএল ব্যবহারকারী নই), তবে, আমি এসকিউএল সার্ভার ব্যবহার করছি, আমি দেখতে পেয়েছি যে এই সমাধানটিতে কর্ন নামটি যুক্ত করে এই সমাধানটি সুন্দরভাবে করা হয়েছে। অর্থাত্ আপনার select 1এবং select 2আমি যোগ করার পরেas <colName>
হার্ভে

8

আমি এখানে সমস্ত উত্তর পড়েছি এবং কী চলছে তা নির্ধারণ করতে কিছুটা সময় নিয়েছে। নীচে মো সিসকো এবং উত্তর সম্পর্কিত কিছু গবেষণার উত্তর ভিত্তিতে তৈরি করা হয়েছে

যদি আপনার এসকিউএল ক্যোয়ারী কোনও ডেটা ফেরত না দেয় তবে নাল মান সহ কোনও ক্ষেত্র নেই তাই ISNULL বা COALESCE উভয়ই যেমন আপনি চান তেমন কাজ করবে না। সাব কোয়েরি ব্যবহার করে, শীর্ষ স্তরের ক্যোয়ারী নাল মান সহ একটি ক্ষেত্র পায় এবং ISNULL এবং COALESCE উভয়ই আপনি যেমন চান / প্রত্যাশা করেন তেমন কাজ করবে।

আমার জিজ্ঞাসা

select isnull(
 (select ASSIGNMENTM1.NAME
 from dbo.ASSIGNMENTM1
 where ASSIGNMENTM1.NAME = ?)
, 'Nothing Found') as 'ASSIGNMENTM1.NAME'

মন্তব্য সহ আমার জিজ্ঞাসা

select isnull(
--sub query either returns a value or returns nothing (no value)
 (select ASSIGNMENTM1.NAME
 from dbo.ASSIGNMENTM1
 where ASSIGNMENTM1.NAME = ?)
 --If there is a value it is displayed 
 --If no value, it is perceived as a field with a null value, 
 --so the isnull function can give the desired results
, 'Nothing Found') as 'ASSIGNMENTM1.NAME'

5

আপনাকে কেবল একটি বাম যোগদানের সাথে WHERE প্রতিস্থাপন করতে হবে:

SELECT  CASE
        WHEN S.Id IS NOT NULL AND S.Status = 1 AND ...) THEN 1
        ELSE 0
    END AS [Value]

    FROM (SELECT @SiteId AS Id) R
    LEFT JOIN Sites S ON S.Id = R.Id

এই সমাধানটি আপনাকে প্রতিটি কলামের জন্যও ডিফল্ট মানগুলি ফেরত দিতে দেয়, উদাহরণস্বরূপ:

SELECT
    CASE WHEN S.Id IS NULL THEN 0 ELSE S.Col1 END AS Col1,
    S.Col2,
    ISNULL(S.Col3, 0) AS Col3
FROM
    (SELECT @Id AS Id) R
    LEFT JOIN Sites S ON S.Id = R.Id AND S.Status = 1 AND ...

4

কোনও রেকর্ডের মিল নেই মানে কোনও রেকর্ড ফেরেনি। যদি কোনও রেকর্ড না পাওয়া যায় তবে 0 এর "মান" পাওয়ার কোনও জায়গা নেই। আপনি যা চান তা করার জন্য আপনি একটি ক্রেজি ইউনিয়ন ক্যোয়ারী তৈরি করতে পারেন তবে ফলাফলের সেটে রেকর্ডের সংখ্যাটি পরীক্ষা করার জন্য আরও অনেক বেশি।


বর্তমানে, আমি এটিই করি। রেকর্ড গণনা খালি কি না তা পরীক্ষা করুন। অঙ্কিত তারা আমার চেক শর্টকাট করার উপায় হতে পারে।
ম্যাট

কিছু অ্যাপ্লিকেশন আপনাকে "কেবল" চেক করার অনুমতি দেয় না
নাদিয়া সলোভিয়েভা

3

এই এক উপায় হতে পারে।

SELECT TOP 1 [Column Name] FROM (SELECT [Column Name] FROM [table]
    WHERE [conditions]
    UNION ALL
    SELECT 0 )A ORDER BY [Column Name] DESC

আমি এই পদ্ধতির পছন্দ। আমি ডিফল্ট ডেটা প্রকাশ করার সময় এটি কিছুটা ক্লিনার মনে করি, বিশেষত যদি আপনি ডেটা / ডিফল্ট মানগুলির অসংখ্য কলাম দিয়ে শেষ করেন।
র‌্যাম্প 51

লল এটি সেরা এবং পরিষ্কার সমাধান
কাইল ব্রাইডেনস্টাইন

1

টাই সঙ্গে কি?

SELECT TOP 1 WITH TIES tbl1.* FROM 
        (SELECT CASE WHEN S.Id IS NOT NULL AND S.Status = 1 
                      AND (S.WebUserId = @WebUserId OR 
                           S.AllowUploads = 1)
                     THEN 1 
                     ELSE 0 AS [Value]
         FROM Sites S
         WHERE S.Id = @SiteId) as tbl1
ORDER BY tbl1.[Value]


1

@ হাই-ফানের ব্যবহারের উত্তরটি LEFT JOINকী, তবে এটি অনুসরণ করা কিছুটা কঠিন। আমার একটি জটিল প্রশ্ন ছিল যা কিছু নাও ফিরিয়ে দিতে পারে। আমি আমার প্রয়োজনের উত্তরটি কেবল সহজ করে দিয়েছি। অনেক কলাম সহ ক্যোয়ারিতে এটি প্রয়োগ করা সহজ।

;WITH CTE AS (
  -- SELECT S.Id, ...
  -- FROM Sites S WHERE Id = @SiteId
  -- EXCEPT SOME CONDITION.
  -- Whatever your query is
)
SELECT CTE.* -- If you want something else instead of NULL, use COALESCE.
FROM (SELECT @SiteId AS ID) R
LEFT JOIN CTE ON CTE.Id = R.ID

আপডেট: স্কেল সার্ভারসেন্ট্রালের এই উত্তরটি সেরা। এটি MAX- এর এই বৈশিষ্ট্যটি কাজে লাগায় - "যখন নির্বাচন করার জন্য কোনও সারি নেই তখন MAX NULL প্রদান করে।"

SELECT ISNULL(MAX(value), 0) FROM table WHERE Id = @SiteId

4
আপডেট করা উত্তর কাজ করে।
অ্যান্ড্রু কোভেনহোভেন

0
You should avoid using expensive methods. You dont need any column for TBL2. 

SELECT COUNT(*) FROM(
         SELECT TOP 1     1 AS CNT  FROM  TBL1 
         WHERE ColumnValue ='FooDoo'  ) AS TBL2

or

IF EXISTS (SELECT TOP 1 1 FROM TABLE1 AS T1 
                          WHERE T1.ColumnValue='VooDoo') 
   SELECT 1 
ELSE 
   SELECT 0

0

আপনি ঠিক এর মতো কিছু করতে পারেন।

IF EXISTS ( SELECT * FROM TableName WHERE Column=colval)
BEGIN
   select 
select name ,Id from TableName WHERE Column=colval
END
ELSE
  SELECT 'test' as name,0 as Id
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.