如果没有找到行SQL,则返回一个值

Mat*_*att 88 sql t-sql

这是我的简单查询.如果我查询不存在的记录,那么我将不会返回任何内容.我更喜欢在那个场景中返回false(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
Run Code Online (Sandbox Code Playgroud)

Moe*_*sko 109

这与Adam Robinson相似,但使用ISNULL而不是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)
Run Code Online (Sandbox Code Playgroud)

如果内部查询具有匹配的行,则返回1.外部查询(使用ISNULL)然后返回此值1.如果内部查询没有匹配的行,则它不返回任何内容.外部查询将此视为NULL,因此ISNULL最终返回0.

  • 很晚,我知道,但你可以用COALESCE替换ISNULL来获得相同的结果. (3认同)
  • 感谢您添加这个!这正是我所需要的,因为我可以 SELECT ISNULL( (SELECT Id ... 而不是 1 来获取我正在寻找的数据! (2认同)
  • 我养成了使用COALESCE而不是ISNULL的习惯,因为从内存(习惯死去)来看,ISNULL在SQL Lite或在较旧的Windows Mobile设备上运行的任何东西都不可用。COALESCE可用于lite,Express和成熟的SQL。 (2认同)

Ada*_*son 61

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)
Run Code Online (Sandbox Code Playgroud)


anA*_*ent 20

这可能是一匹死马,当没有行存在时返回1行的另一种方法是UNION另一个查询并在表中不存在时显示结果.

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
) 
Run Code Online (Sandbox Code Playgroud)

  • 在尝试从查询中获取总计时,我使用了类似的方法.我只是用一个返回0(`SELECT 0`)的查询做了一个联合,然后我在联合上做了一个`SUM`.简单易懂. (2认同)
  • 如果它返回2行,是否保证按预期顺序返回行? (2认同)

Ell*_*lis 10

就像是:

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
Run Code Online (Sandbox Code Playgroud)


Jam*_*ins 8

我在这里阅读了所有的答案,花了一段时间来弄清楚发生了什么.以下是基于Moe Sisko的答案和一些相关研究

如果您的SQL查询未返回任何数据,则不存在具有空值的字段,因此ISNULL和COALESCE都不会按您的要求工作.通过使用子查询,顶级查询获取具有空值的字段,并且ISNULL和COALESCE将按您希望/期望的那样工作.

我的查询

select isnull(
 (select ASSIGNMENTM1.NAME
 from dbo.ASSIGNMENTM1
 where ASSIGNMENTM1.NAME = ?)
, 'Nothing Found') as 'ASSIGNMENTM1.NAME'
Run Code Online (Sandbox Code Playgroud)

我的评论与评论

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'
Run Code Online (Sandbox Code Playgroud)


小智 6

这可能是一种方式。

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


Hai*_*han 5

您只需要用LEFT JOIN替换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
Run Code Online (Sandbox Code Playgroud)

此解决方案允许您还返回每列的默认值,例如:

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 ...
Run Code Online (Sandbox Code Playgroud)