SQL 服务器 ISNULL 多列

SQL Server ISNULL multiple columns

我有以下查询,效果很好,但如何在其 select 语句中添加多个列?以下是查询:

SELECT ISNULL(
(SELECT DISTINCT a.DatasourceID
FROM [Table1] a
WHERE a.DatasourceID = 5 AND a.AgencyID = 4 AND a.AccountingMonth = 201907), NULL) TEST

所以目前我只有一列 (TEST),但想添加其他列,例如 DataSourceID、AgencyID 和 AccountingMonth。

对我来说,您似乎想查看数据是否存在,我猜您的 AgencyID 是代理 table 的外键,DataSourceID 也是 DataSource 的外键,并且您有 AccountingMonth table具有所有会计期间:

    SELECT ds.ID as DataSourceID , ag.ID as AgencyID ,  am.ID as AccountingMonth , 
 ISNULL(COUNT(a.*),0) as Count
    FROM [Table1] a
    RIGHT JOIN [Datasource] ds ON ds.ID = a.DataSourceID
    RIGHT JOIN [Agency] ag ON ag.ID = a.AgencyID
    RIGHT JOIN [AccountingMonth] am on am.ID = a.AccountingMonth 
    GROUP BY ds.ID, ag.ID,  am.ID

通过这种方式,您可以按条件查看每组的记录数。注意 RIGHT join,如果你想包含来自 "Right" table.

的所有记录,你必须使用 RIGHT JOIN

在您的查询中,您有 DISTINCT a.DatasourceID 和 WHERE a.DatasourceID = 5 并且它 returns 5 如果在 table 中存在与您的 WHERE 条件匹配的行,并且 returns 如果没有数据则为null。如果您删除 WHERE a.DatasourceID = 5 您的查询将因错误而中断:子查询返回多行。

你的做法只允许一列和一条记录,并给它命名为测试。看起来您真的不需要测试 null。因为您 returning null 所以这对您没有任何帮助。删除所有空测试和 return 不同的完整记录集也会将您的 return 限制为 1 条记录。使用单个 table 时,如果没有空格或不需要关键字大括号标识符,则不需要别名。如果您需要查看是否有空记录集,请在调用程序中对其进行测试。

SELECT  DatasourceID, AgencyID,AccountingMonth
FROM Table1 
WHERE DatasourceID = 5 AND AgencyID = 4 AND AccountingMonth = 201907

如果你想为某个条件(或要求的值)输出一行,当不满足条件时输出一行, 您可以在 FROM 子句中为您请求的值设置伪 table,并与您的 Table1 进行左外连接。

SELECT ISNULL(Table1.DatasourceId, 999999), 
       Table1.AgencyId,
       Table1.AccountingMonth, 
       COUNT(*) as count
FROM ( VALUES (5, 4, 201907 ),
              (6, 4, 201907 ))
       AS requested(DatasourceId, AgencyId, AccountingMonth)
LEFT OUTER JOIN Table1 ON requested.agencyid=Table1.AgencyId
        AND requested.datasourceid = Table1.DatasourceId
        AND requested.AccountingMonth = Table1.AccountingMonth
GROUP BY Table1.DatasourceId, Table1.AgencyId, Table1.AccountingMonth

注意:

  • 我已经像您一样为第一列添加了 ISNULL,以便在未找到任何值时输出特定值 (9999)。
  • 我没有像您的查询那样将 ISNULL(...,NULL) 放在其他列中,因为恕我直言,这不是必需的:如果没有值,无论如何都会输出 null。
  • 我添加了一个 COUNT(*) 列来说明聚合,如果不需要,您可以使用另一个 (SUM, MIN, MAX) 或 none。
  • 请求值集作为常量 table 值提供(参见 https://docs.microsoft.com/en-us/sql/t-sql/queries/table-value-constructor-transact-sql?view=sql-server-2017
    我为请求的条件添加了多行:您可以在一个查询中请求多个数据源、机构或月份,输出中每行对应一个。
    如果你只想要一行,在 "requested" 伪 table 值中只放一行。
  • 必须有一个 GROUP BY,即使您不想使用聚合(计数、总和或其他)来获得与您的 distinct 子句相同的行为,它也会将输出限制为请求的单行值。