2017-02-08 37 views
0

是否可以使用此列的更改在列上创建索引。 例如 - 我有一列A(nvarchar),但在查询中,我应该替换此列中的值以与列表中的值进行比较。如果我使用的原始值从A列已更改列上的SQL索引

查询看起来像未来

SELECT 
    * 
FROM 
    MyTable 
WHERE 
    REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe') 
+0

在使用功能Where子句将避免使用'Index'。用replace函数更新你的'A'列,然后在'where'子句中可以避免替换函数。 –

+0

@Prdp是的,我知道这种方式,但我需要存储原始值。此时,我只能看到方法 - 用替换的数据创建新列B并在此列上创建索引。但是会有很多重复的数据。 – AndrewVA

+0

[SQL Server - 计算列上的索引是否可能重复?](http://stackoverflow.com/questions/1323214/sql-server-index-on-a-computed-column) – Serg

回答

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) 

仅为期间INSERTUPDATE操作的PERSISTED列,计算将发生。

现在,您可以在查询中使用此列:

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