【问题标题】:Access SQL Is a string-attribute part of another string in the same string-attribute of the same table?Access SQL 是同一个表的同一字符串属性中另一个字符串的字符串属性部分吗?
【发布时间】:2019-04-25 07:19:09
【问题描述】:

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

示例:在上表中,有字符串属性“名称”,我希望有一个查询,该查询可以提供包含在另一个 [名称] 单词中的所有 [名称] 单词(在此示例中我想至少得到“攻击”,但应该有更多的词,而不仅仅是这个)。

我已经尝试过了。像这样:

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

我在想,是否可以将 InStr-Function 与 LIKE 结合使用,但我不知道如何。

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

【问题讨论】:

  • 对于 Access,您需要使用 * 作为通配符,而不是像常规 sql 中那样使用 %

标签: sql ms-access jet


【解决方案1】:

在 Access 中,表示任意数量字符的通配符是 '*' 而不是 '%'
您可以像这样使用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] + '*'

【讨论】:

    【解决方案2】:

    嗯,这需要一些额外的工作,但我可以给你一个良好的开端......
    起初我看不出你怎么能一口气做到这一点。也许其他贡献者有更好的主意,但这是我尝试过的。
    首先,您需要将所有单词提取到一个额外的表中。让我们称之为 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 );
    

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 2014-07-04
      相关资源
      最近更新 更多