SQL查询,连接受操纵的列

时间:2017-04-01 15:31:55

标签: sql sql-server

我有数据库表,其中包含以下列结构和数据(仅限1列示例)

[ProductRaw] [nvarchar](255) NULL
One Kind of Product (CatA)
Another Product (CatB)
Yet Another Product (CatC)

由于其他要求,我无法更改此列,但我还需要加入'在这个专栏的干净版本上。干净的版本看起来像这样

[ProductClean] [nvarchar](255) NULL
One Kind of Product
Another Product
Yet Another Product

在SQL Server中执行此操作的最佳方法是什么?我知道可以使用以下

完成
DECLARE @Sql varchar(50) = 'One Kind of Product (CatA)'    

SELECT
    PARSENAME(REPLACE(@sql,' (','.'),2)

有没有更好的方法(例如计算列)?

2 个答案:

答案 0 :(得分:2)

您可以使用like

on ProductRaw like ProductClean + '%'

但是,我的建议是使用计算列更改表:

alter table t
    add ProductClean as (left(ProductRaw, charindex(' (', ProductRaw + ' (') - 1)));

然后,您可以在ProductClean上添加索引,并进行更明智的联接:

on t.ProductClean = ?.ProductClean

答案 1 :(得分:1)

我的建议是创建一个单独的 索引视图 ,其中包含现有表格的所有列以及另一列命名 ProductClean

CREATE VIEW [P_RawWithClean] WITH SCHEMABINDING
AS

      SELECT *
           , RTRIM(SUBSTRING([ProductRaw], 1, CHARINDEX('(', [ProductRaw] + '(') - 1)) AS [ProductClean]
       FROM [YourTableName]

CREATE UNIQUE CLUSTERED INDEX idx_RawWithClean ON P_RawWithClean(ProductClean)

现在,您可以将此视图用于与 ProductClean ProductRaw 的任何JOIN。索引视图将为您提供更好的性能。此外,如果需要,您可以在任何列上创建非聚集索引。