代码之家  ›  专栏  ›  技术社区  ›  bernando_vialli

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

  •  0
  • bernando_vialli  · 技术社区  · 7 年前

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

    当时,我只是认为我只需要寻找精确匹配,后来我发现我也需要加入部分匹配,其中连接的两个字符串至少有一个完整的公共词。例如,如果我们加入“烧杯”和“大烧杯”,他们应该加入,因为他们有共同的“烧杯”。。。。

    我试图修改我之前的查询,从另一个问题来解释这一点,基于我在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 回复  |  直到 7 年前
        1
  •  1
  •   Wayne G. Dunn    7 年前

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

    不确定您的数据量是多少,但我在下面介绍的SQL很有效 有点

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

    注意:WHERE子句中标准的第一部分寻找精确匹配;第二个标准寻找填充词;第三个标准在“Fieldxx”中查找匹配项

    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]));
    
        2
  •  0
  •   Kashif Qureshi    7 年前

    你的第一份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语句中的false语句。有关更多说明,请访问: https://support.office.com/en-us/article/IIf-Function-32436ecf-c629-48a3-9900-647539c764e3