Microsoft tSQL'de satır bulunmazsa bir değer döndürür


97

SQL'in bir Microsoft sürümünü kullanarak , işte benim basit sorgum. Var olmayan bir kaydı sorgularsam, hiçbir şey döndürülmez. Bu senaryoda yanlış (0) döndürülmesini tercih ederim. Hiçbir kaydı hesaba katmamak için en basit yöntemi arıyoruz.

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

Yanıtlar:


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)

Aşağıdaki sorgu else koşulunda tek bir değer döndürür, ancak ideal olarak birden çok değer döndürmelidir. sayım (QTIB_REQ _) <1 olduğunda durumu seçin, sonra QTIB_REQ_, qb_requisitions_all'den biter, burada QTIB_REQ_ IN ($ Req_disabled_WA) ve CLIENT___BENCH___NON_BILLABLE NOT IN ('Faturalandırılamaz', 'Faturalandırılamaz', 'Faturalandırılamaz', ' SC Stratejik İşe Alımlar ',' Bench / ABD projesi ') ve DATEDIFF (CURDATE (), TARGET_FILL_DATE) <60 ve DATEDIFF (CURDATE (), TARGET_FILL_DATE)> 0
Praneet Bahadur,

128

Bu Adam Robinson'ınkine benzer, ancak COUNT yerine ISNULL kullanır.

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

İç sorguda eşleşen bir satır varsa, 1 döndürülür. Dış sorgu (ISNULL ile) daha sonra bu 1 değerini döndürür. İç sorguda eşleşen satır yoksa hiçbir şey döndürmez. Dış sorgu bunu bir NULL olarak değerlendirir ve bu nedenle ISNULL 0 döndürür.


2
Bunu eklediğiniz için teşekkür ederiz! Tam da ihtiyacım olan şey bu, çünkü sadece ISNULL SEÇİNİZ ((aradığım verileri almak için 1 yerine ID SEÇİN!
Jesse Smith

3
Çok geç, biliyorum, ama aynı sonucu elde etmek için ISNULL'u COALESCE ile değiştirebilirsiniz.
BlueChippy

2
ISNULL yerine COALESCE kullanma alışkanlığını edindim çünkü bellekten (alışkanlıklar zor ölür), ISNULL SQL Lite'da veya daha eski Windows Mobile cihazlarında çalışan adı ne olursa olsun mevcut değildir. COALESCE hem lite, Express hem de tam gelişmiş SQL'de çalışır.
reklamlar

1
0 veya 1 yerine değişken değer elde etmek istiyorsanız daha iyi çalışır. Adam'ın sorgusu gruplama veya buna benzer bir şey gerektirir.
Drac

@MoeSisko Boş ise 0'ı nasıl döndürdüğünü beğendim, ancak 1 döndürmek yerine tablodan değeri döndürmesini nasıl sağlayabilirim?
Michael

21

Bu ölü bir at olabilir, hiçbir satır olmadığında 1 satır döndürmenin başka bir yolu da başka bir sorguyu birleştirmek ve tabloda yok olduğunda sonuçları görüntülemektir.

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
) 

2
Bir sorgudan toplamları almaya çalışırken benzer bir yöntem kullandım. 0 ( SELECT 0) döndüren bir sorgu ile bir birleşim yaptım , sonra SUMbirleşim için bir yaptım . Basit ve takip etmesi kolay.
cjbarth

2
2 satır döndürürse, satırların beklenen sırayla döndürüleceği garanti edilir mi?
Sarsaparilla

Ve yürütme planı için ağır
Fandango68

12

Gibi bir şey:

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

Bana daha anlamlı geldiği için bu çözümü kullandım (geleneksel olarak bir SQL kullanıcısı değilim), ancak SQL Server kullanıyorum, bu çözüme col adını eklemenin bu çözümü güzelce yuvarladığını gördüm. yani, senin select 1ve select 2ben ekledikten sonraas <colName>
Harvey

8

Burada tüm cevapları okudum ve neler olduğunu anlamam biraz zaman aldı. Aşağıdakiler Moe Sisko'nun cevabına ve bazı ilgili araştırmalara dayanmaktadır.

SQL sorgunuz herhangi bir veri döndürmezse, boş değerli bir alan yoktur, bu nedenle ne ISNULL ne de COALESCE sizin istediğiniz gibi çalışmaz. Bir alt sorgu kullanarak, üst düzey sorgu, boş değerli bir alan alır ve hem ISNULL hem de COALESCE, istediğiniz / beklediğiniz gibi çalışır.

Sorgum

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

Yorumlarla ilgili sorgum

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

Yalnızca WHERE'ı LEFT JOIN ile değiştirmeniz gerekir:

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

Bu çözüm, her sütun için varsayılan değerleri de döndürmenize olanak tanır, örneğin:

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

Eşleşen kayıt yok, kayıt döndürülmediği anlamına gelir. Kayıt bulunmazsa 0'ın "değeri" için gidecek yer yoktur. İstediğinizi yapmak için çılgın bir UNION sorgusu oluşturabilirsiniz, ancak sonuç kümesindeki kayıtların sayısını kontrol etmek çok, çok, çok daha iyidir.


Şu anda yaptığım şey bu. Kayıt sayısının boş olup olmadığını kontrol edin. Çekimi kısaltmanın bir yolu olabileceğini düşündüm.
Matt

Bazı uygulamalar "basitçe" kontrol etmenize izin vermiyor
Nadia Solovyeva

3

Bu bir yol olabilir.

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

Bu yaklaşımı beğendim. Varsayılan verileri ifade ederken bunun biraz daha temiz olduğunu hissediyorum, özellikle de çok sayıda veri sütunu / varsayılan değer ile sonuçlanırsanız.
Mark At Ramp51

Lol bu en iyi ve en temiz çözüm
Kyle Bridenstine

1

BAĞLARLA ne olacak?

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
DECLARE @col int; 
select @col = id  FROM site WHERE status = 1; 
select coalesce(@col,0);

1

@ hai-phan'ın cevabını kullanmak LEFT JOINanahtardır, ancak takip etmesi biraz zor olabilir. Ayrıca hiçbir şey döndürmeyen karmaşık bir sorgum vardı. Sadece ihtiyacıma verdiği cevabı basitleştirdim. Birçok sütun içeren sorguya uygulamak kolaydır.

;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

Güncelleme: SqlServerCentral'daki bu cevap en iyisidir. MAX'ın bu özelliğini kullanır - "MAX, seçilecek satır olmadığında NULL döndürür."

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

1
Güncellenen cevap çalışıyor.
Andrew Cowenhoven

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

Aynen bunun gibi bir şey yapabilirsiniz.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.