在由Microsoft JET 4.0驱动程序执行的访问查询中,我必须询问在同一表的同一字符串属性中另一个字符串的字符串属性部分吗?
示例:在上表中,有一个字符串属性“名称”,我想查询一个包含所有[名称]词的查询,这些词包含在另一个[名称]词中(在此示例中)我想至少获得“攻击”,但应该不仅限于此。
我已经尝试过某事。像这样:
SELECT [Name]
FROM [t_object]
WHERE '%'+[Name]+'%' IN (SELECT [Name] FROM [t_object])
我正在考虑,是否可以将InStr-Function与LIKE结合使用,但我不知道如何。
如何在[名称]属性中找到所有已经包含在另一个单词中的单词?
答案 0 :(得分: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] + '*'
答案 1 :(得分:0)
这将需要一些额外的工作,但是我可以帮您起步...
起初我看不到如何做到这一点。也许其他贡献者有一个更好的主意,但这是我尝试过的。
首先,您需要将所有单词提取到一个额外的表中。.let将其命名为NameWords
该表应具有这种简单的结构
ID->自动编号
NameWord-> ShortText
在这里,您将把所有单词都放在Name
中
1次攻击
2种图案
您将使用InStr或Like在当前表和该表之间执行左联接,您将获得与NameWords匹配的所有记录。 (以及那些没有的)
我对此进行了一些测试,使用此
SELECT [t_object].*,NameWords.NameWord
FROM [t_object] LEFT JOIN NameWordsON Instr(t_object.Name,NameWords.NameWord );