Kembalikan nilai jika tidak ada baris yang ditemukan di Microsoft tSQL

97

Menggunakan SQL versi Microsoft , inilah kueri sederhana saya. Jika saya meminta catatan yang tidak ada maka saya tidak akan mendapatkan apa pun yang dikembalikan. Saya lebih suka bahwa false (0) dikembalikan dalam skenario itu. Mencari metode paling sederhana untuk memperhitungkan tidak ada catatan.

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
Matt
sumber

Jawaban:

66
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)
Adam Robinson
sumber
Kueri di bawah mengembalikan nilai tunggal dalam kondisi lain, tetapi idealnya harus mengembalikan beberapa nilai. pilih kasus ketika menghitung (QTIB_REQ _) <1 lalu 0 lagi QTIB_REQ_ diakhiri dari qb_requisitions_all di mana QTIB_REQ_ IN ($ Req_disabled_WA) dan CLIENT___BENCH___NON_BILLABLE NOT IN ('Tidak Dapat Ditagih', 'Tidak Dapat Ditagih', 'Tidak Dapat Ditagih', 'Bench' SC Cleared Strategic Hires ',' Bench / US project ') dan DATEDIFF (CURDATE (), TARGET_FILL_DATE) <60 dan DATEDIFF (CURDATE (), TARGET_FILL_DATE)> 0
Praneet Bahadur
125

Ini mirip dengan Adam Robinson, tetapi menggunakan ISNULL, bukan COUNT.

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

Jika kueri dalam memiliki baris yang cocok, maka 1 dikembalikan. Query luar (dengan ISNULL) kemudian mengembalikan nilai 1. Jika query dalam tidak memiliki baris yang cocok, maka ia tidak mengembalikan apapun. Kueri luar memperlakukan ini seperti NULL, sehingga ISNULL akhirnya mengembalikan 0.

Moe Sisko
sumber
2
Terima kasih telah menambahkan yang ini! Itu persis yang saya butuhkan, karena saya hanya bisa PILIH ISNULL ((PILIH Id ... alih-alih 1 untuk mendapatkan data yang saya cari!
Jesse Smith
3
Sangat terlambat, saya tahu, tetapi Anda dapat mengganti ISNULL dengan COALESCE untuk mencapai hasil yang sama.
BlueChippy
2
Saya terbiasa menggunakan COALESCE daripada ISNULL karena, dari memori (kebiasaan sulit), ISNULL tidak tersedia di SQL Lite atau apa pun namanya yang berjalan di perangkat Windows Mobile yang lebih lama. COALESCE bekerja pada SQL lite, Express, dan full-blown.
Iklan
1
Ini bekerja lebih baik, jika Anda ingin mendapatkan nilai variabel, daripada 0 atau 1. Kueri Adam membutuhkan pengelompokan atau sesuatu seperti itu.
Drac
@ MoeSisko Saya suka bagaimana mengembalikan 0 jika nol, tetapi bukannya mengembalikan 1, bagaimana saya bisa mendapatkannya untuk mengembalikan nilai dari tabel?
Michael
21

Ini mungkin kuda mati, cara lain untuk mengembalikan 1 baris ketika tidak ada baris adalah dengan UNION kueri lain dan menampilkan hasil ketika tidak ada dalam tabel.

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
) 
anAgent
sumber
2
Saya menggunakan metode serupa saat mencoba mendapatkan total dari kueri. Saya hanya melakukan penyatuan dengan kueri yang mengembalikan 0 ( SELECT 0), lalu saya melakukan SUMpenyatuan. Sederhana dan mudah diikuti.
cjbarth
2
Jika mengembalikan 2 baris, apakah dijamin baris akan dikembalikan dalam urutan yang diharapkan?
Sarsaparilla
Dan itu berat pada rencana eksekusi
Fandango68
13

Sesuatu seperti:

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
Ellis
sumber
Saya menggunakan solusi ini karena lebih masuk akal bagi saya (saya bukan pengguna SQL tradisional), Namun, saya menggunakan SQL Server, saya menemukan bahwa menambahkan nama kolom ke solusi ini bulat dengan baik. yaitu setelah Anda select 1dan select 2saya menambahkanas <colName>
Harvey
8

Saya membaca semua jawabannya di sini, dan butuh beberapa saat untuk mencari tahu apa yang sedang terjadi. Berikut jawaban dari Moe Sisko dan beberapa penelitian terkait

Jika kueri SQL Anda tidak mengembalikan data apa pun, tidak ada bidang dengan nilai null sehingga baik ISNULL maupun COALESCE tidak akan berfungsi seperti yang Anda inginkan. Dengan menggunakan sub-kueri, kueri tingkat atas mendapatkan bidang dengan nilai null, dan ISNULL dan COALESCE akan bekerja seperti yang Anda inginkan / harapkan.

Kueri saya

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

Pertanyaan saya dengan komentar

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'
James Jenkins
sumber
5

Anda hanya perlu mengganti WHERE dengan LEFT JOIN:

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

Solusi ini memungkinkan Anda untuk mengembalikan nilai default untuk setiap kolom juga, misalnya:

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 ...
Sarsaparilla
sumber
4

Tidak ada catatan yang cocok berarti tidak ada catatan yang dikembalikan. Tidak ada tempat untuk "nilai" dari 0 jika tidak ada record yang ditemukan. Anda dapat membuat kueri UNION gila untuk melakukan apa yang Anda inginkan, tetapi jauh lebih baik hanya dengan memeriksa jumlah rekaman dalam kumpulan hasil.

Larry Lustig
sumber
Saat ini, itulah yang saya lakukan. Periksa berapa catatan yang kosong atau tidak. Kupikir itu mungkin cara pintas cek saya.
Matt
Beberapa aplikasi tidak mengizinkan Anda "hanya" memeriksa
Nadia Solovyeva
3

Ini mungkin salah satu cara.

SELECT TOP 1 [Column Name] FROM (SELECT [Column Name] FROM [table]
    WHERE [conditions]
    UNION ALL
    SELECT 0 )A ORDER BY [Column Name] DESC
Gopal V
sumber
Saya suka pendekatan ini. Saya merasa itu sedikit lebih bersih saat mengekspresikan data default, terutama jika Anda berakhir dengan banyak kolom data / nilai default.
Tandai Di Ramp51
Lol ini adalah solusi terbaik dan terbersih
Kyle Bridenstine
1

Bagaimana dengan WITH TIES?

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

Jawaban @ hai-phan LEFT JOINadalah kuncinya, tetapi mungkin agak sulit untuk diikuti. Saya memiliki pertanyaan rumit yang mungkin juga tidak menghasilkan apa-apa. Saya baru saja menyederhanakan jawabannya dengan kebutuhan saya. Mudah diterapkan ke kueri dengan banyak kolom.

;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

Pembaruan: Jawaban di SqlServerCentral ini adalah yang terbaik. Ini menggunakan fitur MAX - "MAX mengembalikan NULL ketika tidak ada baris untuk dipilih."

SELECT ISNULL(MAX(value), 0) FROM table WHERE Id = @SiteId
Weihui Guo
sumber
1
Jawaban yang diperbarui berfungsi.
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
Ayhan Sarıtaş
sumber