0

请参阅下面的数据库表,我创建该表是为了解释我的问题:

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 或任何编程语言中)并循环遍历数组以找到精确匹配,但是我不认为这一步是必要的,因为“詹姆斯”将永远是成立。这一步有必要吗?

4

3 回答 3

2

最好在查询中进行过滤。如果有数百万条记录怎么办?您不想先检索所有这些,只是为了过滤。

假设您必须坚持使用这种非规范化模式,我会这样做。前两种情况可以利用data列上的索引。假设数据从来没有前导或尾随分号:

select * 
from Test 
where data = 'James'
    or data like 'James;%'
    or data like '%;James;%' 
    or data like '%;James' 
于 2012-04-16T18:35:05.900 回答
1

使用您粘贴的 SQL,如果在它之前至少有一个字符(例如,“2James”、“BJames”、“2Jamesey”将匹配),或者如果在“james”之后有一个分号(例如, “2詹姆斯;”、“B詹姆斯;”、“詹姆斯”)。但是“James”本身不匹配,因为您使用了下划线。

目前尚不清楚您要做什么。您是否只想查找与单词“James”完全匹配的行(在“James”之前和之后有“word”边界,或者您是否想要在列中的任何位置出现“James”的行,即使它是较大词的一部分,例如“Jamestown”)。您可以通过添加来修复or data = 'James'。我不确定下划线是否在做你想做的事,因为我不确定你的总体目标是什么。您可能需要也可能不需要对查询进行进一步更改。

根据您对表中数据是否干净的信心,您可以编写一个语句来执行您所说的操作。我会将搜索保留在 SQL 语句中,而不是将记录拉出并循环遍历数组中的值,因为在某些情况下这可能会变得低效。

于 2012-04-16T18:33:43.483 回答
1

不,不需要将值加载到数组中 - 在任何情况下都会对性能非常不利。

话虽如此,您的 SQL 有点奇怪 - 如果您想插入由;我认为您需要的名称分隔的名称:

INSERT INTO Test(data) values ('David;James;Michael') 

如果您确保每个名称都以分隔符开头和结尾,可能会更好:

INSERT INTO Test(data) values (';David;James;Michael;') 

然后你可以使用

SELECT * FROM Test WHERE data like '%;James;%'

并确保始终得到正确的结果。

最后但并非最不重要的一点是,可以在单个列中填充多个 valuers,但这不是在 SQL 数据库中做的最好的事情,最好将名称保留在不同表中的单独行中,然后有一个交叉-引用它(规范化结构)。

于 2012-04-16T18:36:50.117 回答