[英]How to MAX() on any column type at SQL Server
我有一个包含许多列和查询构建器的视图,最终将在查询中添加MAX
语句。 问题是,当列类型为BIT时我不能使用MAX
,所以我需要先检查类型。 我无法在查询构建器中检查列的数据类型,因此我需要一个适用于任何数据类型的SQL解决方案。
下面是一个例子(在SELECT
的内CTE
表示VIEW
其可以具有任何类型的数据的mycol
,对于本第一示例我模拟BIT
的。 MAX
部分是我需要工作):
原版的
WITH cte (mycol) AS
(
SELECT CAST(1 as BIT) as mycol
)
SELECT
MAX(mycol) as mycol_max
FROM cte
我收到了这个错误:
操作数数据类型位对于max运算符无效。
铸件
如果我执行以下操作,它将起作用:
WITH cte (mycol) AS
(
SELECT CAST(1 as BIT) as mycol
)
SELECT
MAX(CAST(mycol as INT)) as mycol_max
FROM cte
但是,如果mycol
是一个字符串(SELECT'test'作为mycol),我收到此错误:
将varchar值'test'转换为数据类型int时转换失败。
所以,我尝试使用一些不同的方法检查类型:
ISNUMERIC()
WITH cte (mycol) AS
(
SELECT 'test' as mycol
)
SELECT
MAX(CASE
WHEN 1 = ISNUMERIC(mycol)
THEN CAST(mycol AS INT)
ELSE mycol
END) AS mycol_max
FROM cte
不喜欢%[^ 0-9]%
WITH cte (mycol) AS
(
SELECT 'test' as mycol
)
SELECT
MAX(CASE
WHEN "mycol" NOT LIKE '%[^0-9]%'
THEN CAST(mycol AS INT)
ELSE mycol
END) AS mycol_max
FROM cte;
TRY_PARSE
WITH cte (mycol) AS
(
SELECT 'test' as mycol
)
SELECT
MAX(CASE
WHEN TRY_PARSE(mycol AS INT) IS NOT NULL
THEN CAST(mycol AS INT)
ELSE mycol
END) AS mycol_max
FROM cte
所有这些都返回了错误
将varchar值'test'转换为数据类型int时转换失败。
另外,如果mycol
是一个整数:
WITH cte (mycol) AS
(
SELECT 1 as mycol
)
...
我有
参数数据类型int对于解析函数的参数1无效。
所以,我只需要在MAX()
语句中允许任何内容。 我试过检查和转换,但没有得到任何满意的解决方案。 我该怎么做?
谢谢
使用SQL Server 2017。
BIT不会表现为int,因此MAX不会真正起作用,除非您只选择仍然不是最佳的最大LEN。 您可以尝试ORDER BY DESC,但我怀疑它会有所帮助。 您也可以添加另一个列来指定您正在寻找的MAX。
SELECT TOP 1 CAST(1 as BIT) as mycol
FROM TB1
ORDER BY mycol DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.