Как MAX () для любого типа столбца на SQL Server - PullRequest
0 голосов
/ 31 мая 2019

У меня есть представление со множеством столбцов и конструктор запросов, который в конечном итоге добавит в запрос оператор 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.

CASTING

Если я сделаю следующее, он будет работать:

WITH cte (mycol) AS
(
     SELECT CAST(1 as BIT) as mycol
)
SELECT
    MAX(CAST(mycol as INT)) as mycol_max
FROM cte

Однако, если mycol является строкой (ВЫБЕРИТЕ «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

NOT LIKE% [^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.

1 Ответ

0 голосов
/ 31 мая 2019

BIT Не будет вести себя как int, поэтому MAX не будет работать, если вы просто не выберете max LEN, который все еще не оптимален.Вы можете попробовать ORDER BY DESC, но я сомневаюсь, что это поможет.Вы также можете добавить еще один столбец, в котором будет указано, какой именно МАКС вы ищете.

SELECT TOP 1 CAST(1 as BIT) as mycol
FROM TB1
ORDER BY mycol DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...