如果在Microsoft tSQL中找不到行,则返回值

如果在Microsoft tSQL中找不到行,则返回值,tsql,Tsql,使用Microsoft版本的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 [Va

使用Microsoft版本的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

未匹配记录表示未返回任何记录。如果找不到任何记录,则0的值没有位置。你可以创建一个疯狂的联合查询来做你想做的事情,但只需检查结果集中的记录数就可以做得更好。

这与Adam Robinson的类似,但使用ISNULL而不是COUNT

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)
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。如果内部查询没有匹配行,则不会返回任何内容。外部查询将其视为NULL,因此ISNULL最终返回0。

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

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
) 
比如:

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

只需将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 ...

我在这里读了所有的答案,花了一段时间才弄清楚到底发生了什么。以下是作者的回答和一些相关研究

如果SQL查询不返回任何数据,则没有一个字段具有null值,因此ISNULL和COALESCE都不会按照您的要求工作。通过使用子查询,顶级查询将获得一个具有null值的字段,并且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'
这可能是一种方式

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

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]
@hai phan使用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-


你应该避免使用昂贵的方法。TBL2不需要任何列

SELECT COUNT(*) FROM(
         SELECT TOP 1     1 AS CNT  FROM  TBL1 
         WHERE ColumnValue ='FooDoo') AS TBL2
或此代码:

IF EXISTS (SELECT TOP 1 1 FROM TABLE1 AS T1 
                          WHERE T1.ColumnValue='VooDoo') 
   SELECT 1 
ELSE 
   SELECT 0
 
你可以这样做

我的孤独在起作用

通过将1=2的位置更改为1=1的位置进行can测试

select * from (
    select col_x,case when count(1) over (partition by 1) =1 then 1 else HIDE end as HIDE from (
    select 'test' col_x,1 as HIDE
    where 1=2
    union 
    select 'if no rows write here that you want' as col_x,0 as HIDE
    ) a
    ) b where HIDE=1

我喜欢James Jenkins用ISNULL复选框回答,但我认为他的意思是IFNULL。ISNULL没有像其语法那样的第二个参数,但是如果找到NULL,则在检查表达式以替换它之后,IFNULL有第二个参数。

目前,我就是这么做的。检查记录计数是否为空。我想这可能是我的检查快捷方式。有些应用不允许你简单地检查。谢谢你添加这个!这正是我需要的,因为我可以选择ISNULL SELECT Id。。。而不是1来获取我正在寻找的数据!很晚了,我知道,但是你可以用COALESCE替换ISNULL来获得相同的结果。我养成了使用COALESCE而不是ISNULL的习惯,因为内存习惯很难改变,ISNULL在SQL Lite或在旧的Windows Mobile设备上运行的任何称为ISNULL的东西中都不可用。COALESCE适用于lite、Express和完整的SQL。如果您希望获得变量值,而不是0或1,则它的效果更好。Adam的查询需要分组或类似的内容。@MoeSisko我喜欢如果0为空,它如何返回0,但如何让它从表中返回值,而不是返回1?我在尝试从查询中获取总计时使用了类似的方法。我只是用返回0选择0的查询进行了一个并集,然后对该并集进行了求和。简单易懂。如果它返回2行,是否保证按预期顺序返回行?而且执行计划很繁重我使用此解决方案,因为它对我来说更有意义。我不是传统的SQL用户,但是,我使用SQL Server,我发现将列名称添加到此解决方案中可以很好地完善此解决方案。i、 e.在您选择1和选择2之后,我添加如下,查询在else条件下返回单个值,但理想情况下它应该返回多个值。当我喜欢这种方法时,选择case。我觉得在表达默认数据时会更干净一些,特别是当你有很多列数据/默认值的时候。Lol这是最好最干净的解决方案。这几乎不是一个答案,你可以把它作为一个注释。
IF EXISTS (SELECT TOP 1 1 FROM TABLE1 AS T1 
                          WHERE T1.ColumnValue='VooDoo') 
   SELECT 1 
ELSE 
   SELECT 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
select * from (
    select col_x,case when count(1) over (partition by 1) =1 then 1 else HIDE end as HIDE from (
    select 'test' col_x,1 as HIDE
    where 1=2
    union 
    select 'if no rows write here that you want' as col_x,0 as HIDE
    ) a
    ) b where HIDE=1