SQL BETWEEN 与 CASE 语句

SQL BETWEEN with a CASE STATEMENT

我在使用案例陈述时遇到了一些困难。我需要在具有许多不同字符和条件的字段上 运行 一个 case 语句。我首先需要去除所有非数字值的字段,然后根据字段的值设置一个值,我已经能够编写一个 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 种不同的情况,包含各种 between 和 equals 语句。

有没有人有这样做的解决方案,以便转换只需 运行 一次? table 它是 运行ning 反对是非常大的。

两者的输出应该是:

9    MIN
5    MIN
26   MAX
26   MAX
25   MID
44   UNKNOWN

在 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)