选择部分字符串匹配(仅限完整单词)
Posted
技术标签:
【中文标题】选择部分字符串匹配(仅限完整单词)【英文标题】:Selecting Partial String Matches (Full words only) 【发布时间】:2017-08-07 18:42:26 【问题描述】:几天前,我在这里写了一个问题,得到了回答并帮助我解决了我当时认为是我的项目的问题:
Query only pulling in output from one column instead of all columns
这是之前的工作并且没有问题:
SELECT DISTINCT Product.Category, Analytics.Unique, Product.ID,
Product.Family
FROM Analytics INNER JOIN Product ON Analytics.Search = IIF(Product.Category
= Analytics.Search, Product.Category, IIF(Product.Field4 = Analytics.Search,
Product.Field4,));
当时,我只认为我只需要寻找完全匹配,后来我发现我还需要加入部分匹配,其中两个字符串至少有 1 个完整的常用词正在加入。例如,如果我们加入“Beakers”与“Huge Big Beakers”,他们应该加入,因为它们有共同的“Beakers”......
我已经尝试根据我在 *** 上找到的一些链接修改我之前的查询从另一个问题来解决这个问题,我不断收到语法错误,它并没有真正指出问题出在哪里。这是我的查询(仅适用于 1 列,没有将其复制粘贴到所有列,因为由于某种原因它仍然无法正常工作),我只显示几列,因为它们无论如何都是重复的,并且更容易阅读:
SELECT DISTINCT Product.Category, Analytics.Unique, Product.ID,
Product.Family
FROM Analytics
INNER JOIN Product ON Analytics.Search = IIF((SELECT DISTINCT
Product.Category
FROM Product, Analytics
WHERE ' ' & Product.Category & ' '
Like '* Product.Category *'), Product.Category,
IIF(Product.Field4 = Analytics.Search, Product.Field4,));
我试图添加的这部分有问题,因为它在我遇到的另一个问题之前对完整匹配有效:
Product ON Analytics.Search = IIF((SELECT DISTINCT Product.Category FROM
Product, Analytics WHERE ' ' & Product.Category & ' ' Like '*
Product.Category *'),
【问题讨论】:
由于您没有发布之前工作的完整语法,所以当我之前与此进行比较时,我发现您的新查询有更多的更改,而不仅仅是更改您的选择标准。我建议您通过删除简单测试不需要的任何内容来简化语法,然后慢慢添加。 好的,我更新了我的查询,以便更清楚地了解我最初所做的事情 既然您发布了之前和当前的版本,请注意您在 OLD: FROM Analytics INNER JOIN ... = IIF(Product.Category ... 和 NEW: FROM Analytics INNER JOIN 之间有很大区别... = IIF((SELECT DISTINCT Product.Category 好的,我认为差异是微不足道的,因为它只是一遍又一遍地重复相同的事情......但我再次更新它以使它们现在完全一样,对不起,我应该这样做那是第一次 这是否意味着它现在可以工作,还是您仍然会收到错误? 【参考方案1】:编辑 #1:添加了用空格填充要搜索的字段的 SQL 示例,以便查找整个单词。
不确定您的数据量是多少,但我在下面包含的 SQL 的工作原理有点符合您的要求。您的方法中的一个缺陷是,当您尝试查找“字符串中的单词”时,您不能在前面或后面填充空格,除非您同时填充搜索词和要搜索的字符串(通常,文本字段中没有尾随空格)。
我只做了Field4到Field7,所以你需要调整。
注意:WHERE 子句中标准的第一部分寻找完全匹配;第二个标准查找填充词;第三个条件在您的“Fieldxx”中查找匹配项
这是填充您搜索的每个字段的 SQL:
SELECT DISTINCT ' ' & [Category] & ' ' AS MyCat, Analytics.Unique, Product.ID, Product.Family
FROM Product, Analytics
WHERE (((' ' & [Category] & ' ')=[Analytics]![Search]
Or (' ' & [Category] & ' ') Like "* " & [Analytics]![Search] & " *"))
OR (((' ' & [Field4] & ' ') Like "* " & [Analytics]![Search] & " *"))
OR (((' ' & [Field5] & ' ') Like "* " & [Analytics]![Search] & " *"))
OR (((' ' & [Field6] & ' ') Like "* " & [Analytics]![Search] & " *"))
OR (((' ' & [Field7] & ' ') Like "* " & [Analytics]![Search] & " *"));
或者,一个非常简单的例子:
SELECT DISTINCT Product.Category, Analytics.Unique, Product.ID, Product.Family
FROM Product, Analytics
WHERE (((Product.Category)=[Analytics]![Search]))
OR (((Product.Category) Like "* " & [Analytics]![Search] & " *"))
OR (((Product.Field4)=[Analytics]![Search]))
OR (((Product.Field5)=[Analytics]![Search]))
OR (((Product.Field6)=[Analytics]![Search]))
OR (((Product.Field7)=[Analytics]![Search]));
【讨论】:
我刚刚尝试按如下方式运行它并得到关于语法错误的完全相同的错误消息:SELECT DISTINCT Product.Category, Analytics.Unique, Product.ID, Product.Family FROM Analytics INNER JOIN Product ON Analytics.Search = IIF(SELECT DISTINCT Product.Category, Analytics.Unique, Product.ID, Product.Family FROM Product, Analytics WHERE (((Product.Category)=[Analytics]![Search])) OR (((Product .Category) Like "* " & [Analytics]![Search] & " *")) OR (((Product.Field4)=[Analytics]![Search])) OR (((Product.Field5)=[Analytics]![Search])) OR (((Product.Field6)=[Analytics]![Search])) OR (((Product. Field7)=[分析]![搜索]));所以我不确定问题是什么。另外,我想我不完全理解你写的东西。是不是如果有一个 Like 匹配应该是唯一的匹配类型,因为它还包含完整匹配? 首先,试试我提供的 SQL。如果它有效,那么就有希望。其次,使用查询设计器查看我的 SQL - 而不仅仅是查看 SQL。这将更好地解释它。关于你说应该只有一个“Like”匹配,是的,你可以更改我的 SQL 以使用我提供的使用 LIKE 的示例。但是,如前所述,您需要在 'Product.Category' 和所有 'Fieldxxx' 的正面和背面填充空格(即 SELECT DISTINCT ' ' & [Category] & ' ' AS XX, Analytics.唯一、Product.ID、Product.Family...) 我在答案中添加了另一个示例,用空格填充字段并使用“LIKE” 您提到的两行不同 - 请注意,第二行使用“LIKE”,第一行不使用。这意味着第一个是寻找一个完全匹配的 - 如果这不是你想要做的,你可以删除它。设计视图应该直观地向您展示所有标准的含义。请注意,大多数标准都在不同的行上?这意味着您使用的是“或”(即如果 A = 1 或 B = 2 或 ...)。 Re 'LIKE' vs '=',如果你使用 'If 'Wayne' = 'W' vs 'If 'Wayne' LIKE 'y'...'【参考方案2】:您的第一个 IIF 语句存在问题。 IIF 语句有 3 个部分。
IIf ( experession , truepart , falsepart )
表达是你想要评估的东西。它通常包含= ,> or <
符号
让我们来看看你的第一个 IIF 语句:
iif((SELECT DISTINCT product.category FROM product, analytics WHERE ' ' & product.category & ' ' LIKE '* Product.Category *') , product.category,IIF(.....))
所以你的表达式部分包含这个查询:
(
SELECT DISTINCT product.category
FROM product, analytics
WHERE ' ' & product.category & ' ' LIKE '* Product.Category *'
)
但是您没有评估该查询的结果,您想对该查询的结果做什么?没有 =、> 或
您还缺少最后一个 if 语句中的错误语句。更多解释请访问:https://support.office.com/en-us/article/IIf-Function-32436ecf-c629-48a3-9900-647539c764e3
【讨论】:
我想我明白你的意思,所以我只是用“=”符号进行了更新,但得到完全相同的语法错误消息,查询表达式分析中的语法错误。搜索 =IIF(... . :: SELECT DISTINCT Product.Category, Analytics.Unique, Product.ID, Product.Family FROM Analytics INNER JOIN Product ON Analytics.Search = IIF((SELECT DISTINCT Product.Category FROM Product, Analytics WHERE ' ' & Product.Category & ' ' Like '* Product.Category *') = Analytics.Search, Product.Category, IIF(Product.Field4 = Analytics.Search, Product.Field4));以上是关于选择部分字符串匹配(仅限完整单词)的主要内容,如果未能解决你的问题,请参考以下文章