您可以使用 char 列在表上创建一个持久视图,并在其中删除 M 的计算列。然后你可以JOIN 对包含INT 列的表的视图。
CREATE VIEW dbo.PersistedView
WITH SCHEMA_BINDING
AS
SELECT ConvertedDateCol = CONVERT(INT, REPLACE(VarcharCol, 'M', ''))
--, other columns including the PK, etc
FROM dbo.TablewithCharColumn;
CREATE CLUSTERED INDEX IX_PersistedView
ON dbo.PersistedView(<the PK column>);
SELECT *
FROM dbo.PersistedView pv
INNER JOIN dbo.TableWithIntColumn ic ON pv.ConvertedDateCol = ic.IntDateCol;
如果您提供两个表的实际详细信息,我将编辑我的答案以使其更清晰。
与每次运行SELECT 语句时执行CONVERT 和REPLACE 相比,具有计算列的持久视图在连接两列的SELECT 语句上的性能要好得多。
但是,持久化视图会稍微减慢插入基础表的速度,并且会阻止您对基础表进行 DDL 更改。
如果您不希望通过模式绑定视图保留值,您可以在表本身上创建一个非持久化计算列,然后在该列上创建一个非聚集索引。如果您在WHERE 或JOIN 子句中使用计算列,您可能会看到一些好处。
举例:
CREATE TABLE dbo.PCT
(
PCT_ID INT NOT NULL
CONSTRAINT PK_PCT
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, SomeChar VARCHAR(50) NOT NULL
, SomeCharToInt AS CONVERT(INT, REPLACE(SomeChar, 'M', ''))
);
CREATE INDEX IX_PCT_SomeCharToInt
ON dbo.PCT(SomeCharToInt);
INSERT INTO dbo.PCT(SomeChar)
VALUES ('2015M08');
SELECT SomeCharToInt
FROM dbo.PCT;
结果: