T-SQL -- 更快地匹配 CASE/WHEN 语句中使用的 NOT LIKE '%[^0-9]%'
T-SQL -- faster way to do match for NOT LIKE '%[^0-9]%' used in CASE/WHEN statement
我正在寻找一种可能更快的方法来进行此检查:
NOT LIKE '%[^0-9]%'
这会检查以确保所有字符都是数字(参见 description of T-SQL pattern)
在 Microsoft SQL 服务器 (T-SQL) 中有更快的方法吗?
完整上下文作为 CASE/WHEN 语句的一部分,在 vary large 查询的 select 部分:
Select DATEADD(dd, CAST(CASE WHEN a.dateDuration NOT LIKE '%[^0-9]%' THEN a.Duration ELSE 1 END AS INT), a.StartDate) AS 'ourEndDate'
在上面,a 是一个 table 别名。列 a.dateDuration 是可为空的 varchar 列。 (出于专有原因,实体的真实名称已被替换)。
事实上,这种变体在各种“UNION ALL”运算符中重复出现,因此如果可以使其更快,则可以大大加快查询速度。
NOT LIKE
运算符可能相对较慢。
底层数据库的版本是SQLServer 2012。
在这种情况下,LIKE / NOT LIKE 运算符的性能几乎可以肯定不是问题。如果您的查询速度很慢,请首先考虑您返回了多少行,以及您是否正在对表进行全面扫描以查找有趣的行。
这里看起来你只是想 format/adjust 你的最终结果 - 如果你认为 SQL 在这里太慢你可以在应用程序服务器端进行这个处理,因为这不是一部分从磁盘获取数据。
如果这是子查询,请显示整个查询。
我正在寻找一种可能更快的方法来进行此检查:
NOT LIKE '%[^0-9]%'
这会检查以确保所有字符都是数字(参见 description of T-SQL pattern)
在 Microsoft SQL 服务器 (T-SQL) 中有更快的方法吗?
完整上下文作为 CASE/WHEN 语句的一部分,在 vary large 查询的 select 部分:
Select DATEADD(dd, CAST(CASE WHEN a.dateDuration NOT LIKE '%[^0-9]%' THEN a.Duration ELSE 1 END AS INT), a.StartDate) AS 'ourEndDate'
在上面,a 是一个 table 别名。列 a.dateDuration 是可为空的 varchar 列。 (出于专有原因,实体的真实名称已被替换)。
事实上,这种变体在各种“UNION ALL”运算符中重复出现,因此如果可以使其更快,则可以大大加快查询速度。
NOT LIKE
运算符可能相对较慢。
底层数据库的版本是SQLServer 2012。
在这种情况下,LIKE / NOT LIKE 运算符的性能几乎可以肯定不是问题。如果您的查询速度很慢,请首先考虑您返回了多少行,以及您是否正在对表进行全面扫描以查找有趣的行。
这里看起来你只是想 format/adjust 你的最终结果 - 如果你认为 SQL 在这里太慢你可以在应用程序服务器端进行这个处理,因为这不是一部分从磁盘获取数据。
如果这是子查询,请显示整个查询。