我被隔离了这么久,脑子有点空白,不能把这个简单的问题放在脑后。
我有一个表中的值列表。我想检查@variable中文本的第一部分是否包含表中的任何值。当它是一个精确的匹配,但我不知道如何接近它时,它对字符串的一部分做。
CREATE TABLE [ExclusionCriteria](
[ID] [uniqueidentifier] NOT NULL,
[Criteria] [nvarchar](100) NOT NULL,
CONSTRAINT [PK_ExclusionCriteria] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [ExclusionCriteria] ADD CONSTRAINT [DF_ExclusionCriteria_ID] DEFAULT (newid()) FOR [ID]
INSERT INTO [ExclusionCriteria] (Criteria)
VALUES ('Test1'), ('Test2'),('Another string'),('Test string 4')
DECLARE @TestValue NVARCHAR(100) = 'Test1 but with some more text on the end'
SELECT * FROM ExclusionCriteria WHERE Criteria LIKE @TestValue
我想让它匹配因为第一部分 @TestValue
有 Test1
在里面。我尝试使用子字符串,但根据匹配的内容,“条件”的长度总是不同的。
我想我想做一些类似于列表中的“foreach”的事情,但无法使用sql解决这个问题。这将是某些逻辑的一部分,因此需要遵循 if @TestValue Begins With (any of the values in [ExclusionCriteria]) true else false
这在sql中是可能的还是我必须改变我的方法?我不想把所有的值硬编码成一个长的 IN
声明。
2条答案
按热度按时间gkn4icbw1#
您需要反转顺序并添加一个尾随通配符
如果
ExclusionCriteria
很大而且Criteria
索引后,您可能会在其上添加一个附加 predicateAND Criteria LIKE LEFT(@TestValue,1) + '%'
从查找中获得一定的好处并避免读取所有行。uz75evzq2#