在SQL Server字符串操作查询中不重复表达式的方法

在SQL Server字符串操作查询中不重复表达式的方法,sql,sql-server,tsql,sql-server-2016,Sql,Sql Server,Tsql,Sql Server 2016,我有以下sql: SUBSTRING(Location, CHARINDEX(' : ', Location) + 3, CHARINDEX(' ms - ', Location) - (CHARINDEX(' : ', Location) + 3)) (位置可以是这样:1dasev:232 ms-323-asv3R,而子字符串将返回232) 如果我用C#写这篇文章,我不会重新计算CHARINDEX(':',Location)+3两次。我会将它存储在

我有以下sql:

SUBSTRING(Location, 
          CHARINDEX(' : ', Location) + 3, 
          CHARINDEX(' ms - ', Location) - (CHARINDEX(' : ', Location) + 3))
(位置可以是这样:
1dasev:232 ms-323-asv3R
,而
子字符串将返回
232

如果我用C#写这篇文章,我不会重新计算
CHARINDEX(':',Location)+3两次。我会将它存储在一个变量中,然后重用它


SQL中有什么很酷的技巧可以让我做类似的事情吗?(我的查询将比上面的简单示例更复杂,我希望它更可读。)

您可以使用子查询来定义通用表达式:

SELECT SUBSTRING(Location, x.AfterColon, CHARINDEX(' ms - ', Location) - x.AfterColon)
FROM (
    SELECT *, (CHARINDEX(' : ', Location) + 3) AS AfterColon
    FROM ...
) x

诀窍是使用交叉应用来计算它

SELECT
SUBSTRING(Location, 
          c, 
          CHARINDEX(' ms - ', Location) - c)
FROM  YOURTABLE
      CROSS APPLY
      (
         SELECT c = CHARINDEX(' : ', Location) + 3
      ) c

字符串格式是否一致?您必须引入子查询或公共表表达式,而不是nope,因此通常通过重复公式来完成。完美!非常感谢。