繁体   English   中英

如何在SQL Server上的任何列类型上MAX()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM