0

SQL查询:

SELECT DISTINCT [File Version Number], [Enrollment Employee ID] 
FROM Participant

结果:

+---------------------+------------------------+
| Fule Version Number | Enrollment Employee ID |
+---------------------+------------------------+
| null                | null                   |
| null                | 1100527                |
| null                | 5032506                |
| v2.2.0              | null                   |
+---------------------+------------------------+

期望的结果:排除具有 NULL 数据的行;第一行。

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

任何解决方案或解决方法将不胜感激。谢谢。

4

3 回答 3

1

如果要排除所有值为 的行NULL,则需要一个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;

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

于 2020-08-28T15:57:18.063 回答
1

如果您打算在纯 SQL(没有动态 SQL)中执行此操作,那么,您将需要以一种或另一种方式枚举列名。

基本解决方案是使用or条件:

where col1 is not null or col2 is not null ... or coln is not null;

您也可以使用coalesce()- 正如 HABO 所评论的那样:

where coalesce(col, col2, ..., coln) is not null

concat_ws()也想到了 - 这与coalesce()真正的逻辑相同:

where concat_ws(col1, col2, ..., coln) is not null

最后,我们还可以使用cross applyunpivot,然后聚合:

select ...
from participant p
cross apply (
    select count(col) cnt
    from (values (p.col1), (p.col2), ..., (p.coln)) x(col)
) x
where cnt > 0
于 2020-08-28T15:57:49.380 回答
0

您可以尝试使用 INNER JOIN,例如:

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;

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

所以我建议你仍然应该添加一个 where 语句:

SELECT DISTINCT [File Version Number], [Enrollment Employee ID] 
FROM Participant
WHERE FileVersionNumber IS NOT NULL AND EnrollmentEmployeeID IS NOT NULL;
于 2020-08-28T15:58:04.447 回答