Как сделать все комбинации с заданными словами в SQL - PullRequest
0 голосов
/ 28 мая 2018

Я сделаю поисковый запрос, который выполняет поиск по каждому отдельному слову в моей таблице с использованием SQL Server.Запрос должен работать в следующей ситуации:

  1. Запрос должен искать в полях colour, style, marerial и shape как оператор или
  2. Запрос должен искать по каждому отдельному поисковому слову (например, blue, red, modern и wood) со всеми возможными комбинациями между этими словами.
  3. Поиск значений долженсодержать в столбце, например, как оператор.

Это означает, что для этих слов я могу найти продукты только с [[colour like '%blue%' или colour like '%red%'], material like '%wood%', style like '%modern%' и каждая фигура. (требуется вывод) другими словами все комбинации с каждым словом.

Вот мой запрос на данный момент:

select distinct colour, style, material, shape
from products
where colour in ('blue', 'red', 'modern', 'wood') or
      style in ('blue', 'red', 'modern', 'wood') or
      material in ('blue', 'red', 'modern', 'wood') or
      shape in ('blue', 'red', 'modern', 'wood') ;

Это результат:

| colour    | style    | material           | shape         |
|-----------|----------|--------------------|---------------|
| Modern    | Aluminum | Round              |               |
| Modern    | Metal    | Round              |               |
| Albast    | Modern   | Acrylic            | Round         |
| Albast    | Modern   | Glass              | Cylinder      |
| Albast    | Modern   | Glass              | Other         |
| Albast    | Modern   | Glass              | Rectangle     |
| Albast    | Modern   | Glass              | Round         |
| Albast    | Modern   | Glass              | Square        |
| Albast    | Modern   | Synthetic Material | Globe         |
| Albast    | Modern   | Synthetic Material | Round         |
| Amber     | Modern   | Steel              | Round         |
| Black     | Cottage  | Wood               |               |
| Black     | Cottage  | Wood               | Round         |
| Black     | Modern   | Reflector          |               |
| Black     | Modern   | Abs                | Round         |
| Black     | Modern   | Acrylic            | Round         |
| Black     | Modern   | Aluminum           |               |
| Black     | Modern   | Aluminum           | Corner-Shaped |
| Black     | Modern   | Aluminum           | Cylinder      |
| Black     | Modern   | Aluminum           | Half-Round    |
| Black     | Modern   | Aluminum           | Other         |
| Black     | Modern   | Aluminum           | Oval          |
| Black     | Modern   | Aluminum           | Rectangle     |
| Black     | Modern   | Aluminum           | Round         |
| Black     | Modern   | Aluminum           | Square        |
| Black     | Modern   | Cotton             | Hexagon       |
| Black     | Modern   | Cotton             | Round         |
| Black     | Modern   | Glass              | Rectangle     |

Но я вижу, что результат на основе одного или нескольких слов может быть найден или нет.

Я также пробовал этот запрос, но не нашел результатов.

select distinct colour, style, material, shape
from products
where colour in ('blue', 'red', 'modern', 'wood') and
      style in ('blue', 'red', 'modern', 'wood') and
      material in ('blue', 'red', 'modern', 'wood') and
      shape in ('blue', 'red', 'modern', 'wood') ;

Я не могу определить, является ли слово цветом, формой, стилем или материалом.

Обновление: ожидаемый результат

| colour   | style        | material          | shape         |
|-----------|--------------|--------------------|---------------|
| blue      | modern style | wood               | round         |
| red       | modern       | wood               | Rectangle     |
| red       | modern       | wood               | round         |
| blue      | modern       | wood               | Rectangle     |
| blue      | modern       | wood               | globe         |
| red       | modern       | wood               | globe         |

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

После некоторого поиска я нашел это решение:

  • Я создал хранимую процедуру с одним параметром: @query.
  • Затем я разделил свойзапрос по пробелам.См. Принятый ответ на этот вопрос: Разделение строки на сервере sql .
  • Затем я сделал свое предложение select.
  • И для каждой части своего запроса я добавляю свойwhere и замените {0} на мою часть запроса.
  • Затем просто добавьте 1 = 1, чтобы получить действительный запрос SQL.
  • Выполните мой сгенерированный запрос SQL, используя оператор EXEC.
  • Последнее выполнение моей хранимой процедуры.

Вот мой код:

declare @sql nvarchar(max);
declare @q nvarchar(max);
declare @whereClause nvarchar(max);
declare @currentrow int = 1;

declare @totalqueries int = (select count(pn) 
                             from dbo.SplitString(' ', @query)); -- count how many query 
                                                                 -- parts I've got.

set @sql = 'select distinct colour, style, material, shape
            from products 
            where '; -- my select statement

set @whereClause = 'colour + style + material + shape like ''%{0}%'' and '; -- where clause

while @currentrow <= @totalqueries begin;

    select @q = s 
    from dbo.SplitString(' ', @query)
    where pn = @currentrow;

    set @sql = @sql + REPLACE(@whereClause, '{0}', @q); -- replacing `{0}` with my 
                                                        -- query part `@q`

    set @currentrow = @currentrow + 1;

end;

set @sql = @sql + ' 1 = 1;';

exec (@sql);

См. Также эту функцию:

create FUNCTION dbo.SplitString (@sep nvarchar(1), @s varchar(4000))
    RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
        SELECT 1, 1, CHARINDEX(@sep, @s)
        UNION ALL
        SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
        FROM Pieces
        WHERE stop > 0
    )
    SELECT pn,
        SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS s
    FROM Pieces
)
0 голосов
/ 28 мая 2018

Я думаю, что нет чистого решения.Это утверждение может сделать работу:

select distinct colour, style, material, shape
from products 
where colour + style + material + shape like '%blue%' or
      colour + style + material + shape like '%red%' or
      colour + style + material + shape like '%modern%' or
      colour + style + material + shape like '%wood%';
...