TSQL 使用 table 变量进行类似比较,理想情况下无需迭代

TSQL using table variable for like comparison, ideally without iterating

发帖后,

TSQL Variable With List of Values for IN Clause

我构造了一个table的varchar变量,例如

    Declare @myList_1(Id varchar(2))
Insert into @myList_1
Select id from  (VALUES ('x1')) AS tbl(id)
Insert into @myList_1
Select id from  (VALUES ('x2')) AS tbl(id)
Insert into @myList_1
Select id from  (VALUES ('x3')) AS tbl(id)    

但是,我需要扩展这个概念,这样我就可以做一些事情,比如"like comparison"

例如:

myTable.myCol like ('%' +  @myList_1 + '%')

以上:SSMS 2008 r2 给出错误:'Must declare the scalar variable @myList_1'

如果可能,我想在没有迭代器或循环构造的情况下执行此操作...

让我们假设以下测试数据和 tables 结构。

-- Create test table
CREATE TABLE [dbo].[myTable](
    [Id] [int] NOT NULL PRIMARY KEY,
    [myCol] [varchar](100) NULL)
GO

-- Insert test data
INSERT INTO myTable(Id, myCol)
VALUES (1, 'Bladder cancer'),
    (2, 'Lung cancer'),
    (3, 'Brain cancer'),
    (4, 'Melanoma'),
    (5, 'Breast cancer'),
    (6, 'Non-Hodgkin lymphoma'),
    (7, 'Cervical cancer'),
    (8, 'Ovarian cancer'),
    (9, 'Cardiovascular disease'),
    (10, 'Nerve damage'),
    (11, 'Kidney damage'),
    (12, 'Eye damage'),
    (13, 'Foot damage'),
    (14, 'Skin conditions'),
    (15, 'Alzheimer''s disease'),
    (16, 'Hearing impairment')
GO

现在,实际的 SQL 将基于加入要使用 table 变量进行搜索的 table @myList_1

-- Create list of items to look for
Declare @myList_1 table(Id varchar(20))
Insert into @myList_1
Select id from  (VALUES ('cancer')) AS tbl(id)
Insert into @myList_1
Select id from  (VALUES ('Melanoma')) AS tbl(id)
Insert into @myList_1
Select id from  (VALUES ('lymphoma')) AS tbl(id)    

-- Do query
SELECT myTable.Id, myTable.myCol
FROM myTable
JOIN @myList_1 as ItemsList
ON myTable.myCol like '%' + ItemsList.Id + '%'

在这种简单的情况下,myCol 只能匹配 @myList_1 中的单个值,这应该足够了,但是对于 myCol 可能匹配 @myList_1 您应该将 DISTINCT 添加到查询

-- Do query
SELECT DISTINCT myTable.Id, myTable.myCol
FROM myTable
JOIN @myList_1 as ItemsList
ON myTable.myCol like '%' + ItemsList.Id + '%'