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