SQL МЕЖДУ С ЗАЯВЛЕНИЕМ ПО ДЕЛАМ - PullRequest
1 голос
/ 28 апреля 2020

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

1 Ответ

2 голосов
/ 28 апреля 2020

На SQL сервере, если вы не хотите запускать что-либо несколько раз, используйте APPLY:

select . . .,
       (case when v.val between 1 and 10 then 'MIN'
             when v.val between 11 and 25 then 'MID'
             when v.val = 26 then 'MAX'
             else 'UNKNOWN'
        end    
from . . . CROSS APPLY
     (VALUES ( (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)))
     ) v(val) 
...