我有数据库表,其中包含以下列结构和数据(仅限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)
有没有更好的方法(例如计算列)?
答案 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。索引视图将为您提供更好的性能。此外,如果需要,您可以在任何列上创建非聚集索引。