sql-server 检查字符串是否为数据库中保存的多个单词组合的任意组合

gopyfrb3  于 2022-10-31  发布在  其他
关注(0)|答案(2)|浏览(97)

我有使用EF的SQL Server数据库和应用程序。在继续使用某些功能之前,我想检查一个单词组合列表作为验证。
数据库中的表:
| 字词组合|
| - -|
| %lorem%一个%|
| 一个人。|

我在数据库中有%lorem%ipsum%,我想在.NET应用程序中检查字符串是否与它相似,并获取布尔值结果,例如“ipsum lorem”应返回TRUE

目前我有

context.Table.Select(row=>row.WordCombination).Any(combination=>EF.Functions.Like(myString,combination))

请注意,我使用DB中的组合作为模式

我试图使解决方案尽可能最优,所以我不想枚举表,因为它可能有很多行,我不想添加任何重复项。我还试图只获得两者的组合,所以将“lorem”和“ipsum”中的条目分开目前还不是一个变体。
有没有方法可以找到“lorem ipsum”、“ipsum lorem”和其他组合,如“ipsum 1234 lorem”,而不添加“ipsum%lorem”条目,也不枚举表?(仅使用一个查询)
先谢谢你。

iaqfqrcu

iaqfqrcu1#

下面的不就行了吗?

WHERE (YourColumn LIKE '%lorem%' AND YourColumn LIKE '%ipsum%')
OR YourColumn LIKE '%asdf%'
8aqjt8rx

8aqjt8rx2#

您可以使用如下所示的存储过程:

ALTER PROCEDURE proc_MatchWordCombinations
    @input NVARCHAR(MAX)
AS
BEGIN
    DECLARE searchRows CURSOR
    FOR SELECT * FROM WordCombinations;

    DECLARE @searchRow NVARCHAR(MAX)

    DECLARE @searchParts TABLE(RowID int not null primary key identity(1,1), searchPart NVARCHAR(MAX), processed BIT NOT NULL DEFAULT 0)
    DECLARE @searchPart NVARCHAR(MAX)
    DECLARE @searchPartID INT

    DECLARE @partsToProcess INT
    DECLARE @index INT
    DECLARE @match BIT

    OPEN searchRows

    FETCH NEXT FROM searchRows INTO @searchRow

    WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT 'Search row: ' + @searchRow

        DELETE FROM @searchParts

        INSERT INTO @searchParts (searchPart)
        SELECT value
        FROM STRING_SPLIT(@searchRow, '%');
        DELETE FROM @searchParts WHERE searchPart = ''

        SELECT @partsToProcess = COUNT(1) FROM @searchParts
        SET @index = 0
        SET @match = 1
        WHILE @index < @partsToProcess
        BEGIN
            SET @index = @index + 1
            PRINT @index

            SELECT TOP 1 @searchPart = searchPart, @searchPartID = RowID FROM @searchParts WHERE processed = 0
            UPDATE @searchParts SET processed = 1 WHERE RowID = @searchPartID
            PRINT 'Search part: ' + @searchPart

            IF CHARINDEX(@searchPart, @input) = 0
            BEGIN
                SET @match = 0
                PRINT 'No match: ' + @searchPart
            END
            ELSE
            BEGIN
                PRINT 'Match: ' + @searchPart
            END
        END

        IF @match = 1
        BEGIN
            -- The input matches the search row
            PRINT 'Match on: ' + @searchRow
        END

        FETCH NEXT FROM searchRows INTO @searchRow
    END

    CLOSE searchRows
    DEALLOCATE searchRows
END

并这样称呼它:

EXEC proc_MatchWordCombinations @input = 'ipsum1234lorem'

相关问题