0
是否可以使用此列的更改在列上创建索引。 例如 - 我有一列A(nvarchar),但在查询中,我应该替换此列中的值以与列表中的值进行比较。如果我使用的原始值从A列已更改列上的SQL索引
查询看起来像未来
SELECT
*
FROM
MyTable
WHERE
REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe')
是否可以使用此列的更改在列上创建索引。 例如 - 我有一列A(nvarchar),但在查询中,我应该替换此列中的值以与列表中的值进行比较。如果我使用的原始值从A列已更改列上的SQL索引
查询看起来像未来
SELECT
*
FROM
MyTable
WHERE
REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe')
您可以创建一个计算列,然后在其上创建索引古典指数才会工作。
注意: 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)
仅为期间INSERT
或UPDATE
操作的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
在使用功能Where子句将避免使用'Index'。用replace函数更新你的'A'列,然后在'where'子句中可以避免替换函数。 –
@Prdp是的,我知道这种方式,但我需要存储原始值。此时,我只能看到方法 - 用替换的数据创建新列B并在此列上创建索引。但是会有很多重复的数据。 – AndrewVA
[SQL Server - 计算列上的索引是否可能重复?](http://stackoverflow.com/questions/1323214/sql-server-index-on-a-computed-column) – Serg