SQL查询,如果超过1行的exsists返回0

时间:2016-06-06 11:12:59

标签: sql sql-server

也许有人可以帮我解决以下问题。我有一个返回记录的查询。

但是当它有1行或更多行时,我希望收到0行。我认为查询应该如下:

IF EXISTS(SELECT * FROM Names nm WHERE nm.Username = '%a%')
BEGIN
    -- I should return 0 rows if the query above has rows
END

5 个答案:

答案 0 :(得分:2)

如果您想要一行(如果存在)或没有行,您可以这样做:

SELECT *
FROM Names nm
WHERE nm.Username = '%a%' AND
      (SELECT COUNT(*) FROM Names nm WHERE nm.Username = '%a%') <= 1;

但是,这不会区分不匹配和多场比赛。

答案 1 :(得分:0)

如果要仅使用列结构返回空结果集,可以使用

SELECT * 
FROM Names 
WHERE 1=0

SELECT TOP 0 * 
FROM Names

两个查询都返回一个空结果集,其中包含Names表的列结构。

答案 2 :(得分:0)

下面的代码可能有所帮助:

IF EXISTS(SELECT * FROM Names nm WHERE nm.Username = '%a%')
BEGIN
        -- It should return 0 rows if the query above has rows
        SELECT * FROM Names nm WHERE 1=2;

END

答案 3 :(得分:0)

您可以写如下。

IF EXISTS(SELECT * FROM Names nm WHERE nm.Username = '%a%')
BEGIN
     SELECT * FROM Names WHERE 1=0
END

答案 4 :(得分:0)

除了戈登的回答,也许这些都很有帮助。当只有一个用户名与某个模式匹配时,您似乎只对返回结果感兴趣。

-- just the username
select min(nm.Username) as Username
from Names nm
where nm.Username = '%a%'
having count(*) = 1

-- all the columns
select * from
    (
    select *, count(*) over () as cnt
    from Names nm
    where nm.Username = '%a%'
    )
where cnt = 1

如果您不想在输出中看到cnt,则必须列出各个列名称。