0

我有一个包含很多列的表,其中一些列的名称以“EQ”开头。对于单个行,我想对以“EQ”开头的列中的所有值求和,而不是其他值。我知道我可以这样做:

select EQ_DOMESTIC + EQ_INTL + EQ_OTHER from myTable where id=1

但是,我有很多列,我想知道是否可以系统地进行操作,而无需输入每列的名称。我是否必须在另一个查询中从系统表中获取列名?

后续问题:一些值是空值,这使得总和为空。有什么方法可以避免为总和写出 ISNULL(column,0) 吗?

4

1 回答 1

4

您可以使用动态 SQL 轻松完成此操作:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
   + COALESCE(' + QUOTENAME(name) + ', 0)'
FROM sys.columns
  WHERE [object_id] = OBJECT_ID('dbo.MyTable')
  AND name LIKE 'EQ[_]%';

SELECT @sql += N',' + QUOTENAME(name)
  FROM sys.columns
  WHERE [object_id] = OBJECT_ID('dbo.MyTable')
  AND name NOT LIKE 'EQ[_]%';

SELECT @sql = 'SELECT [EQ_SUM] = 0' + @sql
  + ' FROM dbo.MyTable WHERE id = 1;';

PRINT @sql;
-- EXEC sp_executesql @sql;
于 2012-07-02T19:02:08.127 回答