SQL逐行求多BAND列最大值:无需硬编码适配列新增的方案咨询
解法1:使用内置GREATEST函数(最简便)
主流数据库(MySQL、PostgreSQL、Oracle、SQL Server 2022及更高版本)都支持行级最大值函数GREATEST,直接传入所有需要比较的列即可,写法比CASE语句简洁很多:
SELECT *, GREATEST([BAND 1], [BAND 2], [BAND 3], [BAND 4], [BAND 5], [BAND 6], [BAND 7], [BAND 8], [BAND 9], [BAND 10]) AS [MAX BAND] FROM [my table]
后续新增BAND 11列时,只需要在GREATEST的参数列表中补加对应列名即可。
解法2:适配旧版SQL Server的实现
如果用的是2022之前的SQL Server版本,不支持GREATEST,可以用CROSS APPLY+行值构造的方式实现,扩展性同样优于CASE语句:
SELECT t.*, m.max_band AS [MAX BAND] FROM [my table] t CROSS APPLY ( SELECT MAX(band_val) AS max_band FROM (VALUES ([BAND 1]), ([BAND 2]), ([BAND 3]), ([BAND 4]), ([BAND 5]), ([BAND 6]), ([BAND 7]), ([BAND 8]), ([BAND 9]), ([BAND 10]) ) AS v(band_val) ) m
新增BAND列时,只需要在VALUES的列表里追加对应列即可。
解法3:完全免修改的动态SQL方案
如果希望后续新增符合BAND X命名规则的列时,不需要修改查询代码,可以用动态SQL自动拉取所有BAND列计算:
DECLARE @sql NVARCHAR(MAX), @band_cols NVARCHAR(MAX) -- 自动获取表中所有BAND开头的列名 SELECT @band_cols = STRING_AGG(QUOTENAME(name), ', ') FROM sys.columns WHERE object_id = OBJECT_ID('my table') AND name LIKE 'BAND %' SET @sql = N' SELECT *, GREATEST(' + @band_cols + N') AS [MAX BAND] FROM [my table] ' EXEC sp_executesql @sql
注意动态SQL需要做好权限控制,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

