在数据库中使用通配符查询 SQL 服务器

Query SQL Server with wildcard IN the database

我需要构建一个查询,其中条件必须与数据库中的通配符匹配。

举个例子就最清楚了

我有一列包含这样的字段 963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX~ 字符是通配符。 所以以下条件必须匹配:

我试了很多东西都头疼:(

换一种方式(使用条件中的通配符)没问题,很简单。但是这样我找不到钥匙。

问题是当我在字段中有一个 ~ 时它不匹配。所以这里只有第一个和最后一个与以下语句匹配:

SELECT myField FROM myTable WHERE myField LIKE REPLACE('%' + myCriteria + '%', '~', '_');

似乎图案和字段都向左调整了。
如果确实是这样,我低下头(充满悲伤),这是一个功能。

create function is_a_match (@myField varchar(100),@myCriteria varchar(100))
returns bit
as
begin

    declare  @i                 int = 0
            ,@is_a_match        bit = 1
            ,@len_myField       int = len(@myField)
            ,@len_myCriteria    int = len(@myCriteria)
            ,@myField_c         char(1)
            ,@myCriteria_c      char(1)

    While 1=1
    begin

        set @i += 1 

        if @i > @len_myCriteria break

        if @i > @len_myField    
        begin 
            set @is_a_match = 0 
            break 
        end

        set @myField_c    = substring(@myField   ,@i,1)
        set @myCriteria_c = substring(@myCriteria,@i,1)

        if not (@myField_c = '~' or @myCriteria_c = '~' or @myField_c = @myCriteria_c) 
        begin 
            set @is_a_match = 0 
            break 
        end

    end

    return @is_a_match
end

GO

select      myCriteria
           ,dbo.is_a_match (myField,myCriteria) as is_a_match

from        (values ('~63-4-AKS~M'                          )
                   ,('963-4-AKS1M'                          )
                   ,('963-4-AKS~M2RN21AXA150AAA'            )
                   ,('963-4-AKSAM2RN21AXA150AAA'            )
                   ,('963-4-AKSCM2RN21AXA150A060C1D1DSDXX'  )
                   ,('963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX'  )
                   ,('963-4-AKS~M2RN21AXA150~~~0C1X1D~~XX'  )
                   ,('963-4-AKS~M2RN21AXA150~~~0C1D1D~~XXYY')

            ) c (myCriteria)
           ,(values ('963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX'  )
            ) f (myField)

+---------------------------------------+------------+
| myCriteria                            | is_a_match |
+---------------------------------------+------------+
| ~63-4-AKS~M                           | 1          |
+---------------------------------------+------------+
| 963-4-AKS1M                           | 1          |
+---------------------------------------+------------+
| 963-4-AKS~M2RN21AXA150AAA             | 1          |
+---------------------------------------+------------+
| 963-4-AKSAM2RN21AXA150AAA             | 1          |
+---------------------------------------+------------+
| 963-4-AKSCM2RN21AXA150A060C1D1DSDXX   | 1          |
+---------------------------------------+------------+
| 963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX   | 1          |
+---------------------------------------+------------+
| 963-4-AKS~M2RN21AXA150~~~0C1X1D~~XX   | 0          |
+---------------------------------------+------------+
| 963-4-AKS~M2RN21AXA150~~~0C1D1D~~XXYY | 0          |
+---------------------------------------+------------+

您正在混合字段和模式。
该字段不能包含通配符。

例如 由于 'A'

这不是匹配项

963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX
963-4-AKSAM2RN21AXA150AAA

如果你能收紧通配符的限制,你在这里可能会有一战的机会。我的意思是,如果持久化数据中出现通配符,您将生成有效的排列。然后使用现有查询查询排列。

但是如果每个通配符都有 36 个可能的选项,这将变得非常痛苦。