Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL select distinct exclude NULL行_Sql_Sql Server_Where Clause_Sql Null - Fatal编程技术网

SQL select distinct exclude NULL行

SQL select distinct exclude NULL行,sql,sql-server,where-clause,sql-null,Sql,Sql Server,Where Clause,Sql Null,SQL查询: 选择不同的[文件版本号],[注册员工ID] 来自参与者 结果: +-----------+------------+ |Fule版本号|注册员工ID| +-----------+------------+ |空|空| |空| 1100527| |空| 5032506| |v2.2.0 |空| +-----------+------------+ 所需结果:排除数据为空的行;第一排 我知道我们可以在两个列上都使用where子句来过滤空行,但是如果我们要选择大量的列,并且我们不想使用长

SQL查询:

选择不同的[文件版本号],[注册员工ID] 来自参与者 结果:

+-----------+------------+ |Fule版本号|注册员工ID| +-----------+------------+ |空|空| |空| 1100527| |空| 5032506| |v2.2.0 |空| +-----------+------------+ 所需结果:排除数据为空的行;第一排

我知道我们可以在两个列上都使用where子句来过滤空行,但是如果我们要选择大量的列,并且我们不想使用长where子句,该怎么办


如有任何解决方案或解决办法,将不胜感激。谢谢。

如果要排除所有值均为空的行,则需要where子句:

Select Distinct [File Version Number], [Enrollment Employee ID] 
From Participant
where [File Version Number] is not null or [Enrollment Employee ID] is not null;

如果您关心的是编写查询,那么您可以通过使用数据库的元数据表来实现这一点。可以使用SQL、电子表格或其他工具查询列元数据以构造where子句。

如果要排除所有值均为空的行,则需要where子句:

Select Distinct [File Version Number], [Enrollment Employee ID] 
From Participant
where [File Version Number] is not null or [Enrollment Employee ID] is not null;

如果您关心的是编写查询,那么您可以通过使用数据库的元数据表来实现这一点。您可以使用SQL或电子表格或其他工具查询列元数据以构造where子句。

如果要在纯SQL中执行此操作而不使用动态SQL,则需要以某种方式枚举列名

基本解决方案是使用或调节以下条件:

where col1 is not null or col2 is not null ... or coln is not null;
您也可以使用coalesce-正如哈博推荐的那样:

where coalesce(col, col2, ..., coln) is not null
我还想到了concat_ws——这与coalesce的逻辑是一样的:

最后,我们还可以使用交叉应用程序取消PIVOT,然后聚合:

select ...
from participant p
cross apply (
    select count(col) cnt
    from (values (p.col1), (p.col2), ..., (p.coln)) x(col)
) x
where cnt > 0

如果要在没有动态SQL的纯SQL中执行此操作,则需要以某种方式枚举列名

基本解决方案是使用或调节以下条件:

where col1 is not null or col2 is not null ... or coln is not null;
您也可以使用coalesce-正如哈博推荐的那样:

where coalesce(col, col2, ..., coln) is not null
我还想到了concat_ws——这与coalesce的逻辑是一样的:

最后,我们还可以使用交叉应用程序取消PIVOT,然后聚合:

select ...
from participant p
cross apply (
    select count(col) cnt
    from (values (p.col1), (p.col2), ..., (p.coln)) x(col)
) x
where cnt > 0

您可以尝试使用内部联接,例如:

SELECT DISTINCT [File Version Number], [Enrollment Employee ID] 
FROM Participant AS p1
INNER JOIN Participant AS p2 ON p1.[Enrollment Employee ID] = p2.[Enrollment Employee ID]
WHERE FileVersionNumber IS NOT NULL AND EnrollmentEmployeeID IS NOT NULL;

但在这种情况下,您必须加入任何可能包含空值的字段

因此,我建议您仍然应该添加where语句:

SELECT DISTINCT [File Version Number], [Enrollment Employee ID] 
FROM Participant
WHERE FileVersionNumber IS NOT NULL AND EnrollmentEmployeeID IS NOT NULL;

您可以尝试使用内部联接,例如:

SELECT DISTINCT [File Version Number], [Enrollment Employee ID] 
FROM Participant AS p1
INNER JOIN Participant AS p2 ON p1.[Enrollment Employee ID] = p2.[Enrollment Employee ID]
WHERE FileVersionNumber IS NOT NULL AND EnrollmentEmployeeID IS NOT NULL;

但在这种情况下,您必须加入任何可能包含空值的字段

因此,我建议您仍然应该添加where语句:

SELECT DISTINCT [File Version Number], [Enrollment Employee ID] 
FROM Participant
WHERE FileVersionNumber IS NOT NULL AND EnrollmentEmployeeID IS NOT NULL;

如果您可以合并不同的列,即存在一些兼容的数据类型,并且结果为null,那么它们都是null。您可以使用动态sql吗?检查这是否有助于您确定此处的确切位置。您使用的是什么SGBDR?如果只有第一行,[Enrollment Employee ID]不为NULL或[File Version Number]不为NULL?如果您可以合并各个列,即存在一些兼容的数据类型,并且结果为NULL,则它们都为NULL。您可以使用动态sql吗?检查这是否可以帮助您确定此处所需的确切位置。您使用的SGBDR是什么?如果只有第一行,[Enrollment Employee ID]不为NULL或[File Version Number]不为NULL?内部联接将通过不是外部联接排除联接条件为NULL的行,因此,无需添加where子句,只要每个列都连接到自身。单个内部联接就足够了,因为所有列都可以集中到一个on子句中。除了不清楚之外,这对where子句的改进还不清楚。内部连接将通过不是外部连接排除连接条件为null的行,因此只要每个列都连接到自身,就不需要添加where子句。单个内部联接就足够了,因为所有列都可以集中到一个on子句中。除了不清楚之外,这如何改善where条款尚不清楚。