sql—检查字符串的第一部分是否存在于表中的值列表中

bxfogqkk  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(300)

我被隔离了这么久,脑子有点空白,不能把这个简单的问题放在脑后。
我有一个表中的值列表。我想检查@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

我想让它匹配因为第一部分 @TestValueTest1 在里面。我尝试使用子字符串,但根据匹配的内容,“条件”的长度总是不同的。
我想我想做一些类似于列表中的“foreach”的事情,但无法使用sql解决这个问题。这将是某些逻辑的一部分,因此需要遵循 if @TestValue Begins With (any of the values in [ExclusionCriteria]) true else false 这在sql中是可能的还是我必须改变我的方法?我不想把所有的值硬编码成一个长的 IN 声明。

gkn4icbw

gkn4icbw1#

您需要反转顺序并添加一个尾随通配符

SELECT * 
FROM ExclusionCriteria 
WHERE @TestValue LIKE Criteria + '%'

如果 ExclusionCriteria 很大而且 Criteria 索引后,您可能会在其上添加一个附加 predicate AND Criteria LIKE LEFT(@TestValue,1) + '%' 从查找中获得一定的好处并避免读取所有行。

uz75evzq

uz75evzq2#

DECLARE     @ExclusionCriteria  TABLE   ([Criteria] [nvarchar](100))
INSERT INTO @ExclusionCriteria  VALUES
    ('Test1'), ('Test2'),('Another string'),('Test string 4')

DECLARE @TestValue NVARCHAR(100)

SET @TestValue = 'Test1 but with some more text on the end'

    --  If you want to compare with the first word in the Test Value only
    --  CHARINDEX here will look for the first space, returns the position
    --  The position returned then will be used by the LEFT function to get the first word.
    --  I substracted 1 from the position returned to excluded the space itself.
    SELECT  *
    FROM    @ExclusionCriteria 
    WHERE   Criteria  = LEFT(@TestValue, CHARINDEX(' ', @TestValue)-1)

    --  If you want to compare any part of the TestValue
    --  CHARINDEX here will look the Criteria as part of the TestValue. 
    --  If exists, then will return the position, which will be greater than zero.
    SELECT  *
    FROM    @ExclusionCriteria 
    WHERE   CHARINDEX(Criteria, @TestValue) > 0

SET @TestValue = 'Test1 but with some another string'
    SELECT  *
    FROM    @ExclusionCriteria 
    WHERE   Criteria  = LEFT(@TestValue, CHARINDEX(' ', @TestValue)-1)

    SELECT  *
    FROM    @ExclusionCriteria 
    WHERE   CHARINDEX(Criteria, @TestValue) > 0

相关问题