是否可以使用此列的更改在列上创建索引。 例如 - 我有一个列A(nvarchar),但在查询中我应该替换此列中的值以与列表中的值进行比较。仅当我使用A列中的原始值时,经典索引才有效。
查询看起来像下一个
SELECT
*
FROM
MyTable
WHERE
REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe')
答案 0 :(得分:0)
您可以创建计算列,然后在其上创建索引。
注意: SQL Server索引键列的900 byte size limit。由于您的列为NVARCHAR
,因此每个字符消耗2个字节。所以,让我们可以将索引限制在400个字符(800字节)。
为了节省空间,我们可以进一步限制此列包含值,只要它符合您所需的条件。
ALTER TABLE MyTable
ADD A_NoSpace AS (CASE WHEN REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe') THEN LEFT(REPLACE(A, ' ', ''), 400) END) PERSISTED
CREATE NONCLUSTERED INDEX IX_A_NoSpace ON MyTable (A_NoSpace)
作为PERSISTED
列,仅在INSERT
或UPDATE
操作期间进行计算。
您现在可以在查询中使用此列:
SELECT *
FROM
MyTable
-- Don't need to check if value is in the list,
-- because we're already doing this in the computed column definition
WHERE A_NoSpace IS NOT NULL