SQL像在文本中的任何地方都带有两个通配符

时间:2018-11-29 08:39:25

标签: sql sql-server wildcard sql-like

是否有一种方法可以使用like和两个单词(或更多个单词)创建一个where语句,但是它们与给定单词的顺序不同?

select 
    i.ITEM_NUMBER as Item,
    min(i.ITEM_DESCRIPTION) as Description,
    i.ORGANIZATION_CODE as Org,
    max(m.MANUFACTURER_NAME) as Manufacturer,
    max(m.MANUFACTURERS_PARTNUMBER) as Partnumber
from mis.XXEAM_INVENTORY_REPORT_WITH_LOCATORS_CONSIGNED_MATERIAL_AND_CATEGORIES_TBL i
left outer join 
    mis.XXEAM_MANUFACTURING_PART_NUMBERS_TBL m on i.ITEM_NUMBER = m.ITEM_NUMBER
where 
    i.ITEM_DESCRIPTION like '%ALLEN BRADLEY%PLC%' 
group by i.ORGANIZATION_CODE, i.ITEM_NUMBER

我想在上面的描述文本中搜索“%ALLEN BRADLEY%PLC%”或“%PLC%ALLEN BRADLEY%”。我想避免使用OR语句,因为数据集很大并且查询可能需要很长时间。

通配符可以超过两个,我仅以这两个为例。在我看来,例如,我更愿意为第一个单词获取数据集,然后从该数据集获取第二个单词。也许唯一的方法是选择临时表。

3 个答案:

答案 0 :(得分:5)

您可以对“ ALLEN BRADLEY”和“ PLC”执行两个类似的操作。它应该可以满足您的需求:

SELECT
    i.ITEM_NUMBER AS Item
   ,MIN(i.ITEM_DESCRIPTION) AS Description
   ,i.ORGANIZATION_CODE AS Org
   ,MAX(m.MANUFACTURER_NAME) AS Manufacturer
   ,MAX(m.MANUFACTURERS_PARTNUMBER) AS Partnumber
FROM mis.XXEAM_INVENTORY_REPORT_WITH_LOCATORS_CONSIGNED_MATERIAL_AND_CATEGORIES_TBL i
LEFT OUTER JOIN mis.XXEAM_MANUFACTURING_PART_NUMBERS_TBL m
    ON i.ITEM_NUMBER = m.ITEM_NUMBER
WHERE i.ITEM_DESCRIPTION LIKE '%ALLEN BRADLEY%' 
    and i.ITEM_DESCRIPTION LIKE '%PLC%' 
GROUP BY i.ORGANIZATION_CODE
        ,i.ITEM_NUMBER

答案 1 :(得分:0)

您可以使用:

PATINDEX ('((.*)[ALLEN BRADLEY](.*)[PLC](.*))|('(.*)[PLC](.*)[ALLEN BRADLEY](.*)'), 
i.ITEM_DESCRIPTION);

答案 2 :(得分:0)

根据您对高性能,强大查询的需求,在列上创建全文索引是有意义的。通过使用索引,这将使您的查询受益,并且在将新项目包括到条件中时,还可以给您带来灵活性。如果查询很小,那么LIKE就足够了,但是对于时间有限的长表,则创建全文索引。

WHERE CONTAINS (i.ITEM_DESCRIPTION,"'ALLEN BRADLEY' OR 'PLC' OR 'any other item searched'");