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)
我在使用案例陈述时遇到了一些困难。我需要在具有许多不同字符和条件的字段上 运行 一个 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)