也许有人可以帮我解决以下问题。我有一个返回记录的查询。
但是当它有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
答案 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
,则必须列出各个列名称。