【发布时间】:2019-06-09 13:10:56
【问题描述】:
我有一个名为 X 的列,在此列中实际上存储了 2 个不同的信息。我知道如何拆分它们,但我想要一些优化的东西,或者至少比我的查询更优化。
我有一个查询正在运行,但我预计它在处理大量数据时会遇到困难。
SELECT
CASE SUBSTRING(X,1,3)
WHEN 'AAA' THEN SUBSTRING(X,1,10)
WHEN 'BBB' THEN SUBSTRING(X,1,20)
END as firstinfo,
CASE SUBSTRING(X,1,3)
WHEN 'AAA' THEN SUBSTRING(X,11,5)
WHEN 'BBB' THEN SUBSTRING(X,21,5)
END as secondinfo
FROM Table
结果是这样的:
firstinfo |secondinfo
------------------------------
AAAfstdata |smthg
BBBfirstdatalongerXX|else
是否可能只有一个条件,因为它是相同的 case 和 when 条件,显示 2 列
【问题讨论】:
-
将两项信息存储在两个不同的列中。这是最佳方法。
-
这里没有什么可以“优化”的;优化器将只评估一次
SUBSTRING(X,1,3)。您可以考虑CROSS APPLY和一个表值函数(和/或将这些表达式嵌入为计算列,这样您就不会到处重复自己),但这可能有点矫枉过正。 T-SQL 中的字符串操作很笨拙而且速度很慢,无论您如何切片(双关语) -
天哪......修复数据结构,你根本不需要这个问题。
-
请注意,
where firstinfo = '...'形式的任何查询无论如何都会变慢,因为您正在处理计算值。仅仅为了显示目的而提取数据,实际上并没有什么可以优化的(或迫切需要)。为了有效/高效地将列用作单独的值,您至少需要索引视图,但更好的是只需要一个新表。为了保持与现有代码的兼容性,您可以使X由CONCATing 计算。 (当然,与索引相同的警告也适用于 that 列。) -
表达式看起来是确定性的,因此您可以简单地创建一个持久的计算列并完成。您还可以在此类列上创建索引。
标签: sql sql-server substring case