【问题标题】:SQL BETWEEN with a CASE STATEMENT带有 CASE 语句的 SQL BETWEEN
【发布时间】: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


【解决方案1】:

在 SQL Server 中,如果您不想多次运行某些内容,请使用 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) 

【讨论】:

  • 我能够使用 CROSS APPLY 来做我需要的事情。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2019-08-31
  • 1970-01-01
  • 2023-02-21
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多