Asp.net 类SQL-精确匹配
请参阅下面的数据库表,我创建该表是为了解释我的问题:Asp.net 类SQL-精确匹配,asp.net,sql,Asp.net,Sql,请参阅下面的数据库表,我创建该表是为了解释我的问题: CREATE Table Test(id int not null IDENTITY,data varchar(100)) INSERT INTO Test(data) values ('Simon') INSERT INTO Test(data) values ('David;James;Michael') 请参见下面的SQL语句: select * from Test where data like '%_James%' or
CREATE Table Test(id int not null IDENTITY,data varchar(100))
INSERT INTO Test(data) values ('Simon')
INSERT INTO Test(data) values ('David;James;Michael')
请参见下面的SQL语句:
select *
from Test
where data like '%_James%'
or data like '%James;%'
我相信,如果分号总是用作分隔符,那么无论表格单元格中有一个名称还是多个名称,都会找到James
另一位开发人员说,他会将值加载到数组中(在ASP.NET或任何编程语言中),并循环通过数组找到精确的匹配项,但是我认为这一步不是必需的,因为“James”总是会被找到。是否需要执行此步骤?使用您粘贴的SQL,如果前面至少有一个字符(例如,“2James”、“BJames”、“2Jamesey”将匹配),或者如果“james”后面有分号(例如,“2James;”、“BJames;”、“james”)。但是“James”本身不匹配,因为您使用了下划线 你到底想做什么还不清楚。您是否只想查找与单词“James”完全匹配的行(在“James”之前和之后有“word”边界),还是希望在列中任何位置出现“James”的行,即使它是较大单词的一部分,例如“Jamestown”)。您可以通过添加
或data='James'
进行修复。我不确定下划线是否在做你想做的事情,因为我不确定你的总体目标是什么。您可能需要也可能不需要对查询进行进一步更改
根据您对表中数据是否干净的信心,您可以编写一条语句来执行您所说的。我会将搜索保持在SQL语句中,而不是拉出记录并循环数组中的值,因为在某些情况下这可能会变得效率低下 使用您粘贴的SQL,如果前面至少有一个字符(例如,“2James”、“BJames”、“2Jamesey”将匹配),或者如果“james”后面有分号(例如,“2James;”、“BJames;”、“james”)将找到james。但是“James”本身不匹配,因为您使用了下划线 你到底想做什么还不清楚。您是否只想查找与单词“James”完全匹配的行(在“James”之前和之后有“word”边界),还是希望在列中任何位置出现“James”的行,即使它是较大单词的一部分,例如“Jamestown”)。您可以通过添加
或data='James'
进行修复。我不确定下划线是否在做你想做的事情,因为我不确定你的总体目标是什么。您可能需要也可能不需要对查询进行进一步更改
根据您对表中数据是否干净的信心,您可以编写一条语句来执行您所说的。我会将搜索保持在SQL语句中,而不是拉出记录并循环数组中的值,因为在某些情况下这可能会变得效率低下 最好在查询中进行筛选。如果有数以百万计的记录呢?您不想首先检索所有这些,只是为了过滤 假设您必须坚持这个非规范化模式,我会这样做。前两种情况可以使用
data
列上的索引。假设数据从来没有前导或尾随分号:
select *
from Test
where data = 'James'
or data like 'James;%'
or data like '%;James;%'
or data like '%;James'
最好在查询中进行筛选。如果有数以百万计的记录呢?您不想首先检索所有这些,只是为了过滤 假设您必须坚持这个非规范化模式,我会这样做。前两种情况可以使用
data
列上的索引。假设数据从来没有前导或尾随分号:
select *
from Test
where data = 'James'
or data like 'James;%'
or data like '%;James;%'
or data like '%;James'
不需要,在数组中加载值是不必要的,而且在任何情况下都会对性能造成很大影响 前面已经说过,SQL有点奇怪-如果您想插入由
分隔的名称代码>我认为您需要:
INSERT INTO Test(data) values ('David;James;Michael')
如果确保每个名称都以分隔符开头和结尾,可能会更好:
INSERT INTO Test(data) values (';David;James;Michael;')
然后你可以用
SELECT * FROM Test WHERE data like '%;James;%'
并确保始终得到正确的结果
最后但并非最不重要的一点是,可以在一列中填充多个值,但在SQL数据库中这不是最好的做法,最好将名称保留在不同表中的单独行中,然后对其进行交叉引用(规范化结构)。否,在数组中加载值是不必要的,而且在任何情况下都会对性能造成很大影响
前面已经说过,SQL有点奇怪-如果您想插入由分隔的名称代码>我认为您需要:
INSERT INTO Test(data) values ('David;James;Michael')
如果确保每个名称都以分隔符开头和结尾,可能会更好:
INSERT INTO Test(data) values (';David;James;Michael;')
然后你可以用
SELECT * FROM Test WHERE data like '%;James;%'
并确保始终得到正确的结果
最后但并非最不重要的一点是,可以在一列中填充多个估价师,但在SQL数据库中这不是最好的做法,最好将名称保留在不同表中的单独行中,然后对其进行交叉引用(规范化结构)。我认为您缺少了部分答案我过早地点击了“保存”。MiMo的回答解决了我提到的关于您在该表中可能遇到的数据类型的问题。如果你能控制它的结构,这是一个不错的方法。不过,我倾向于对数据进行非规范化处理(不要将多个值放在同一个字段中。我认为您缺少部分答案。我点击了save(保存)太早了。MiMo的答案解决了我提到的关于您在该表中可能遇到的数据类型的问题。如果您能够控制数据的结构,那么这是一种不错的方法。不过,我倾向于对数据进行非规范化(不要将多个值放在同一个字段中。谢谢。我明白你的意思。你认为在运行查询后将值加载到数组中以查找精确匹配有什么好处吗?没有,没有好处。问题是,通过这种方式,你还可以找到以