У меня возникли некоторые трудности с получением заявления по делу. Мне нужно выполнить оператор case для поля, которое имеет много разных символов и условий. Сначала мне нужно удалить из поля все нечисловые значения c, а затем установить значение на основе значения поля. Я смог написать оператор case, который делает это, но он очень медленный. Это работает:
CASE
WHEN (SELECT CAST(CAST((SELECT SUBSTRING(fieldtoreplace, Number, 1) FROM master..spt_values WHERE Type='p' AND Number <= LEN(fieldtoreplace) AND SUBSTRING(fieldtoreplace, Number, 1) LIKE '[0-9]' FOR XML Path('')) AS xml) AS varchar(255))) BETWEEN 1 and 10 THEN 'MIN'
WHEN (SELECT CAST(CAST((SELECT SUBSTRING(fieldtoreplace, Number, 1) FROM master..spt_values WHERE Type='p' AND Number <= LEN(fieldtoreplace) AND SUBSTRING(fieldtoreplace, Number, 1) LIKE '[0-9]' FOR XML Path('')) AS xml) AS varchar(255))) BETWEEN 11 and 25 THEN 'MID'
WHEN (SELECT CAST(CAST((SELECT SUBSTRING(fieldtoreplace, Number, 1) FROM master..spt_values WHERE Type='p' AND Number <= LEN(fieldtoreplace) AND SUBSTRING(fieldtoreplace, Number, 1) LIKE '[0-9]' FOR XML Path('')) AS xml) AS varchar(255))) = 26 THEN 'MAX'
ELSE 'UNKNOWN'
END
Однако я надеялся, что смогу сделать что-то похожее на приведенное ниже, где он выполняет преобразование только один раз вместо каждой строки оператора case.
CASE (SELECT CAST(CAST((SELECT SUBSTRING(fieldtoreplace, Number, 1) FROM master..spt_values WHERE Type='p' AND Number <= LEN(fieldtoreplace) AND SUBSTRING(fieldtoreplace, Number, 1) LIKE '[0-9]' FOR XML Path('')) AS xml) AS varchar(255)))
WHEN BETWEEN 1 and 10 THEN 'MIN'
WHEN BETWEEN 11 and 25 THEN 'MID'
WHEN 26 THEN 'MAX'
ELSE 'UNKNOWN'
END
Фактическое утверждение - это 41 различный случай с различными утверждениями между и равными.
Есть ли у кого-нибудь решение для этого, чтобы преобразование нужно было выполнить только один раз? таблица, с которой он работает, очень велика.
Вывод для обоих должен быть:
9 MIN
5 MIN
26 MAX
26 MAX
25 MID
44 UNKNOWN