选择一个单元格值等于ms sql中参数或所有值的行

选择一个单元格值等于ms sql中参数或所有值的行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这是我的select语句: SELECT * FROM Persons p WHERE p.Name= ISNULL(@Name, p.Name) 它@Name为空它只选择Name不为空的行,而不选择值为空的行 要选择所需的行,必须做些什么?试试这个 SELECT * FROM Persons p WHERE p.Name= coalesce(@Name, p.Name) 试试这个 SELECT * FROM Persons p WHERE p.Name= coalesce(@Name, p

这是我的select语句:

SELECT * FROM Persons p
WHERE p.Name= ISNULL(@Name, p.Name)
@Name
为空它只选择
Name
不为空的行,而不选择值为
空的行

要选择所需的行,必须做些什么?

试试这个

SELECT * FROM Persons p
WHERE p.Name= coalesce(@Name, p.Name)
试试这个

SELECT * FROM Persons p
WHERE p.Name= coalesce(@Name, p.Name)

如果我理解正确,您需要:

SELECT * FROM Persons p
WHERE (p.Name= ISNULL(@Name, p.Name) OR Name IS NULL)

如果我理解正确,您需要:

SELECT * FROM Persons p
WHERE (p.Name= ISNULL(@Name, p.Name) OR Name IS NULL)

@Name
NULL
时,查询变为

SELECT *
FROM Persons P 
WHERE p.Name = p.Name
NULL
不等于
NULL
,因为它意味着未知值和两个未知值不相等

获取所有数据的一种方法是

SELECT *
FROM   Persons P
WHERE  COALESCE(p.Name, N'a') = COALESCE(@Name, p.Name, N'a')
因此,当p.Name为
NULL
时,有一个默认值可供使用


编辑因为字符串
'NULL'
作为
合并
的最后一个值可能会令人困惑,我将其更改为另一个常量文本。

@Name
NULL
时,查询变为

SELECT *
FROM Persons P 
WHERE p.Name = p.Name
DECLARE @name varchar(290) ='Thomas'

SELECT * FROM 
Persons P
WHERE exists(select name intersect select coalesce(@name, name))
NULL
不等于
NULL
,因为它意味着未知值和两个未知值不相等

获取所有数据的一种方法是

SELECT *
FROM   Persons P
WHERE  COALESCE(p.Name, N'a') = COALESCE(@Name, p.Name, N'a')
因此,当p.Name为
NULL
时,有一个默认值可供使用

编辑,因为字符串
'NULL'
作为
合并的最后一个值可能会让人困惑,我将其更改为另一个常量文字。

写为:

DECLARE @name varchar(290) ='Thomas'

SELECT * FROM 
Persons P
WHERE exists(select name intersect select coalesce(@name, name))
SELECT * FROM Persons p
WHERE 1 = case when isnull(@Name,'') = '' then 1 
          when isnull(@Name,'') <> '' and p.Name = @Name  then 1 
          end
从人员中选择*p
其中1=当isnull(@Name,“”)为“”时的大小写,然后1
当isnull(@Name,“)”和p.Name=@Name时,则为1
结束
写为:

SELECT * FROM Persons p
WHERE 1 = case when isnull(@Name,'') = '' then 1 
          when isnull(@Name,'') <> '' and p.Name = @Name  then 1 
          end
从人员中选择*p
其中1=当isnull(@Name,“”)为“”时的大小写,然后1
当isnull(@Name,“)”和p.Name=@Name时,则为1
结束

似乎您想要显示所有条目,如果
@name为null
,如果不是,则只显示与
@name
共享相同值的值,这应该可以做到:

SELECT * FROM Persons WHERE @name IS NOT NULL AND name = @name OR @name IS NULL

似乎要显示所有条目,如果
@name为null
,如果不是,则仅显示与
@name
共享相同值的值,这应该可以做到:

SELECT * FROM Persons WHERE @name IS NOT NULL AND name = @name OR @name IS NULL

当名称参数值为空时,我只得到名称为空的名称,但我只得到名称为空的名称。这与操作系统的查询之间没有功能上的区别。您可以发布一些输入数据和所需的输出,很难理解这是什么!我在原始帖子的评论中发布了一个简单的屏幕,当
@Name
null
时,这就是我想要的,当它不是
null
时,我想要Name==@Name@pepela您的屏幕截图令人困惑,因为它显示的
一个条目的名称为非空
,而所有
其他条目的名称值为空
,这是否意味着如果
@name为null
您需要所有条目?或者只有那些有空值的?@drcopyplaste当
@Name
为空时,我需要所有条目。这与OPS的查询之间没有功能上的区别。您可以发布一些输入数据和所需的输出,这需要花费很长时间才能理解!我在原始帖子的评论中发布了一个简单的屏幕,当
@Name
null
时,这就是我想要的,当它不是
null
时,我想要Name==@Name@pepela您的屏幕截图令人困惑,因为它显示的
一个条目的名称为非空
,而所有
其他条目的名称值为空
,这是否意味着如果
@name为null
您需要所有条目?还是只有那些有空值的?@drcopyplaste当
@Name
为空时,我需要所有条目。而且
'null'
不等于
null
啊,对不起,很好,你清除了它!在你的帖子上读一点快一点;)而且
'NULL'
不等于
NULL
啊,对不起,很好,你把它清除了!在你的帖子上读一点快一点;)当@Name有值时,此选项不起作用;当@Name有值时,此选项不起作用;当@Name有值时,此选项不起作用;当@Name有值时,此选项不起作用;当@Name有值时,此选项不起作用;当@Name有值时,此选项不起作用;当@Name有值时,此选项不起作用