在数据库中使用通配符查询 SQL 服务器
Query SQL Server with wildcard IN the database
我需要构建一个查询,其中条件必须与数据库中的通配符匹配。
举个例子就最清楚了
我有一列包含这样的字段 963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX
。
~
字符是通配符。
所以以下条件必须匹配:
~63-4-AKS~M
963-4-AKS1M
963-4-AKS~M2RN21AXA150AAA
963-4-AKSAM2RN21AXA150AAA
963-4-AKSCM2RN21AXA150A060C1D1DSDXX
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 个可能的选项,这将变得非常痛苦。
我需要构建一个查询,其中条件必须与数据库中的通配符匹配。
举个例子就最清楚了
我有一列包含这样的字段 963-4-AKS~M2RN21AXA150~~~0C1D1D~~XX
。
~
字符是通配符。
所以以下条件必须匹配:
~63-4-AKS~M
963-4-AKS1M
963-4-AKS~M2RN21AXA150AAA
963-4-AKSAM2RN21AXA150AAA
963-4-AKSCM2RN21AXA150A060C1D1DSDXX
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 个可能的选项,这将变得非常痛苦。