选择部分字符串匹配(仅限完整单词)

时间:2017-08-07 18:42:27

标签: sql ms-access

几天前我在这里写了一个问题,得到了回答并帮助我解决了当时我的想法:

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,));

当时,我只觉得我只需要查找完全匹配,我发现我需要加入部分匹配,其中至少有一个完整的常用字,这两个字符串都是加入。例如,如果我们加入" Beakers" vs"巨大的烧杯"他们应该加入,因为他们有烧杯"共同的......

我已经尝试从其他问题修改我之前的查询以基于我在stackoverflow上找到的一些链接来解释这一点,我不断收到语法错误,它并没有真正指出问题所在。这是我的查询(它只适用于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 *'),

2 个答案:

答案 0 :(得分:1)

编辑#1:添加了SQL样本,​​用空格填充要搜索的字段,以便查找整个单词。

不确定您的数据量是多少,但下面包含的SQL 有点就像您想要的那样。你的方法中的一个缺陷是,当你试图找到“字符串中的单词”时,你不能在正面或背面填充空格,除非你同时填充搜索术语和要搜索的字符串(通常,文本字段中没有尾随空格。)

我只通过Field7做了Field4,所以你需要调整。

注意: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]));

答案 1 :(得分:0)

您的第一份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 *'
)

但是你没有评估该查询的结果,你试图用该查询的结果做什么?有没有=,&gt;或者&lt;评估结果

你也错过了最后一句if语句中的false语句。如需更多说明,请访问:https://support.office.com/en-us/article/IIf-Function-32436ecf-c629-48a3-9900-647539c764e3