SQL Server为空多列

SQL Server为空多列,sql,sql-server,isnull,Sql,Sql Server,Isnull,我有一个很好的查询,但是如何在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和Accounting

我有一个很好的查询,但是如何在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是agency表的外键,DataSourceID也是DataSource的外键,并且您有AccountingMonth表,其中包含所有会计期间:

    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
通过这种方式,您可以按条件查看每个组的记录数。注意右联接,若要包括“右”表中的所有记录,必须使用右联接


在您的查询中,您有不同的a.DatasourceID,其中a.DatasourceID=5,如果表中存在与您的WHERE条件匹配的行,则返回5,如果没有数据,则返回null。如果删除其中的a.DatasourceID=5,则查询将中断,并出现错误:子查询返回多行。

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

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

如果要为某些条件(或请求的值)输出一行,并在不满足条件时输出一行, 您可以在FROM子句中为请求的值设置一个伪表,并与表1进行左外部联接

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)放在其他列中,因为IMHO没有必要这样做:如果没有值,将输出NULL
  • 我添加了一个COUNT(*)列来说明聚合,如果不需要,可以使用另一个(SUM、MIN、MAX)或none
  • 请求的值集作为常量表值提供(请参阅)
    我为请求的条件添加了多行:您可以在一个查询中请求多个数据源、机构或月份,每个查询在输出中有一行。
    如果只需要一行,请在“请求的”伪表值中只放置一行
  • 必须有一个GROUP BY,即使您不想使用聚合(count、sum或other)以便具有与distinct子句相同的行为,它也会将请求值的输出限制为单行

表格定义、样本数据和预期结果将大大有助于更好地服务!因此,它只输出一列“TEST”,值为5。其他列是否共享相同的条件?你担心会有零ROE被退回吗?您意识到,
isnull(x,null)
一事无成?@shawnt00——好吧,现在如果DataSourceID=5,我得到一行,如果DataSourceID为5,我得到null,这就是我想要看到的,但我确实需要添加更多列,是的,它们都将为null。如果您的查询返回的行数超过1行,会是什么?为什么不直接
选择DISTINCT ISNULL(a.DatasourceID,SomeValue)
?设置
ISNULL(Column,NULL)
如果该列已经是
NULL
,那么设置毫无意义,谢谢!基本上,原始查询是有效的,但我想添加更多的列,但不知道如何添加,但您的示例至少给了我一个想法,我可以得到我想要的。。。所有列都是表1的一部分,它们不是FKSJ必须澄清的是,我想编写一个查询,其中如果条件满足,则返回一行,如果条件不满足,则返回一行以及您无法使用的行:从[Table1]中选择a.DatasourceID,a.AgencyID,a.AccountingMonth,COUNT(*)a.DatasourceID,a.AgencyID=4,a.AccountingMonth,但您只能查看没有空值的现有记录。如果您只想查看是否有数据,则可以进行查询,如果您在select中放置的列多于子查询中多行的风险。你们在WHERE子句中做了你们想做的一切:WHERE子句告诉你们要寻找什么,而Distinct告诉你们它是否存在。谢谢你们,让我仔细考虑一下。。。如果条件不符合,我不想划船