【发布时间】:2020-04-29 02:29:00
【问题描述】:
我在使案例陈述起作用时遇到了一些困难。我需要在具有许多不同字符和条件的字段上运行 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 种不同的 case,有各种 between 和 equals 语句。
有没有人为此提供解决方案,以便只运行一次转换?它运行的表非常大。
两者的输出应该是:
9 MIN
5 MIN
26 MAX
26 MAX
25 MID
44 UNKNOWN
【问题讨论】:
-
(1) 用您正在使用的数据库标记您的问题。 (2) 提供样本数据和所需的结果。
标签: sql sql-server case transform