如何简化多列 SQL Server where 子句中的重复变量

Ric*_*ich 2 sql-server substring

我知道必须有更好的方法来针对多列评估一组重复变量。我已经搜索了一段时间,但仍然没有很好的解决方案。有一个更好的方法吗?

SELECT *
FROM TABLE
WHERE 
  (SUBSTRING(COLUMN1,1,3) IN ('val1','val2','val3','val4'...REPEATS to 30)  
OR SUBSTRING(COLUMN2,1,3) IN ('val1','val2','val3','val4'...REPEATS to 30)  
OR SUBSTRING(COLUMN3,1,3) IN ('val1','val2','val3','val4'...REPEATS to 30)  
OR SUBSTRING(COLUMN4,1,3) IN ('val1','val2','val3','val4'...REPEATS to 30)  
OR SUBSTRING(COLUMN5,1,3) IN ('val1','val2','val3','val4'...REPEATS to 30))   
...REPEATS 5 MORE TIMES
Run Code Online (Sandbox Code Playgroud)

Han*_*non 5

从此类查询中获得合理性能的一种好方法是将'val1', 'val2', ...值插入到临时表中,然后连接到该临时表。

我们从一些示例数据开始:

USE tempdb;
IF OBJECT_ID('dbo.Items') IS NOT NULL DROP TABLE dbo.Items;
CREATE TABLE dbo.Items
(
    ItemID int NOT NULL IDENTITY(1,1)
        CONSTRAINT PK_Items
        PRIMARY KEY CLUSTERED
    , col1 varchar(30) NOT NULL
    , col2 varchar(30) NOT NULL
    , col3 varchar(30) NOT NULL
    , col4 varchar(30) NOT NULL
) ON [PRIMARY];

INSERT INTO dbo.Items (Col1, Col2, Col3, Col4)
VALUES ('value0', 'value02', 'value03', 'value04')
    , ('value11', 'value21', 'value31', 'value41')
    , ('value5', 'value6', 'value7', 'value8');
Run Code Online (Sandbox Code Playgroud)

为了找到所需的行,我们将搜索词插入到一个临时表中,然后对其进行连接:

IF OBJECT_ID('tempdb..#SearchItems') IS NOT NULL DROP TABLE #SearchItems;
CREATE TABLE #SearchItems
(
    val varchar(30) NOT NULL
        PRIMARY KEY CLUSTERED
);

INSERT INTO #SearchItems (val)
VALUES ('value2%')
    , ('value03%')
    , ('cow%');

SELECT i.*
FROM dbo.Items i
    INNER JOIN #SearchItems si 
        ON (i.col1 LIKE si.val)
            OR (i.col2 LIKE si.val)
            OR (i.col3 LIKE si.val)
            OR (i.col4 LIKE si.val);
Run Code Online (Sandbox Code Playgroud)

上面查询的输出:

+--------+---------+---------+---------+---------+
| 商品编号 | 列 1 | col2 | col3 | col4 |
+--------+---------+---------+---------+---------+
| 1 | 值0 | 值02 | 值03 | 值04 |
| 2 | 值11 | 值21 | 值31 | 值41 |
+--------+---------+---------+---------+---------+