簡體   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