Access SQL是同一个表的同一个字符串属性中另一个字符串的字符串属性部分吗?

问题描述 投票:0回答:2

在由Microsoft JET 4.0驱动程序执行的Access Query中,我必须询问同一个表的同一字符串属性中的另一个字符串的字符串属性部分是否存在?

The table

示例:在上表中,有一个字符串属性'name',我希望有一个查询,它给我所有[Name]字,包含在另一个[Name]字中(在这个例子中我想要得到至少'攻击',但应该有更多的话,而不仅仅是这个)。

我已经试过s.th.像这样:

SELECT [Name] 
FROM [t_object]
WHERE '%'+[Name]+'%' IN (SELECT [Name] FROM [t_object])

我在考虑,如果可以将InStr功能与LIKE结合使用,但我不知道如何使用。

如何在属性[名称]中找到已包含在另一个单词中的所有单词?

sql ms-access jet
2个回答
2
投票

在Access中,表示任意数量字符的通配符char是'*'而不是'%'。 您可以像这样使用LIKE运算符:

SELECT [Name] 
FROM [t_object]
WHERE [Name] LIKE '*Attack*';

这将给出包含'Attack'的列的所有值。 如果你想要[Name]的所有行,其中这个值包含在另一个[Name]中,你可以使用EXISTS

SELECT t.[Name] 
FROM [t_object] AS t
WHERE EXISTS (
  SELECT 1 FROM [t_object] 
  WHERE [Name] <> t.[Name] AND 
  [Name] LIKE '*' + t.[Name] + '*'  
)

或者使用联接来获取两个值:

SELECT t.[Name] AS contained, tt.[Name] AS container 
FROM [t_object] AS t INNER JOIN [t_object] AS tt
ON t.[Name] <> tt.[Name] AND tt.[Name] LIKE '*' + t.[Name] + '*'

0
投票

那么这需要一些额外的工作,但我可以给你一个良好的开端...... 起初我看不出你怎么能一次性完成它。可能其他贡献者有更好的想法,但这是我尝试过的。 首先,您需要将所有单词提取到一个额外的表中.lets称之为NameWords 该表应该具有这种简单的结构 ID - >自动编号 NameWord - > ShortText 在这里,您将把所有单词放在名称中 1攻击 2模式 您将使用InStr或Like在当前表和此表之间执行左连接,您将获得与NameWords匹配的所有记录。 (以及没有的那些)我对此做了一点测试,它使用这个按预期返回所有内容

SELECT [t_object].*,NameWords.NameWord 
FROM [t_object] LEFT JOIN NameWordsON Instr(t_object.Name,NameWords.NameWord );
© www.soinside.com 2019 - 2024. All rights reserved.