SQL select distinct exclude NULL行
SQL查询: 选择不同的[文件版本号],[注册员工ID] 来自参与者 结果: +-----------+------------+ |Fule版本号|注册员工ID| +-----------+------------+ |空|空| |空| 1100527| |空| 5032506| |v2.2.0 |空| +-----------+------------+ 所需结果:排除数据为空的行;第一排 我知道我们可以在两个列上都使用where子句来过滤空行,但是如果我们要选择大量的列,并且我们不想使用长where子句,该怎么办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子句来过滤空行,但是如果我们要选择大量的列,并且我们不想使用长
如有任何解决方案或解决办法,将不胜感激。谢谢。如果要排除所有值均为空的行,则需要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条款尚不清楚。