SQL, как с двумя подстановочными знаками в любом месте в тексте - PullRequest
0 голосов
/ 29 ноября 2018

Есть ли способ создать оператор where, используя like с двумя словами (или более), но они не в том же порядке, что и слова?

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 голосов
/ 29 ноября 2018

вы можете использовать:

PATINDEX ('((.*)[ALLEN BRADLEY](.*)[PLC](.*))|('(.*)[PLC](.*)[ALLEN BRADLEY](.*)'), 
i.ITEM_DESCRIPTION);
0 голосов
/ 29 ноября 2018

В зависимости от вашей потребности в мощном и мощном запросе имеет смысл создать полнотекстовый индекс для столбца.Он будет полезен для вашего запроса с помощью индекса, а также даст вам гибкость при включении новых элементов в условие.Если запрос небольшой, LIKE будет достаточно, но для длинных таблиц, где время является проблемой, создайте полнотекстовый индекс.

WHERE CONTAINS (i.ITEM_DESCRIPTION,"'ALLEN BRADLEY' OR 'PLC' OR 'any other item searched'");
0 голосов
/ 29 ноября 2018

Вы можете сделать два LIKE для '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
...