Как найти строку в базе данных которая содержит все слова из массива слов sql?

Есть база данных со строками различного содержания . Как написать запрос SELECT id from table где строка содержит все слова из заданного массива слов, + которые находятся в любом месте строки.

например $abc = array(яблоко, вишня, груша, персик) и так далее, длина массива неизвестна. запись в базе id=1; string = "На завтрак у меня были фрукты"; id=2; string = "На завтрак у меня вишня , яблоко , персик, и груша."; как написать запрос sql чтобы вернуть идентификатор записи, которая содержит все слова из массива $abc;

то есть в моем примере іd=2


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

Реализация в SQL Server.

Использует XML, XQuery и quantified expressions.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, sentence NVARCHAR(MAX));
INSERT INTO @tbl (sentence) VALUES
(N'На завтрак у меня были фрукты'),
(N'На завтрак у меня вишня , яблоко , персик, и груша.');
-- DDL and sample data population, end

DECLARE @Separator NCHAR(1) = SPACE(1)
    , @comma NCHAR(1) = ','
    , @dot NCHAR(1) = '.'
    , @parameterXML NVARCHAR(MAX)
    , @parameter NVARCHAR(MAX) = N'яблоко, вишня, груша, персик';

SET @parameterXML = REPLACE(N'<source><row>' 
   + REPLACE(@parameter, @comma, N'</row><row>') 
   + N'</row></source>', SPACE(1), '');

SELECT id, sentence
    , TRY_CAST(N'<root>' + @parameterXML 
        + '<target><row>' 
        + REPLACE(REPLACE(REPLACE(sentence, @comma, ''), @dot, ''), @Separator, N'</row><row>') 
            + '</row></target></root>' AS XML)
        .value('every $r in /root/source/row/text()
                satisfies ($r = (/root/target/row/text())
             )', 'BIT') AS result
FROM @tbl;

Результат

+----+-----------------------------------------------------+--------+
| id |                      sentence                       | result |
+----+-----------------------------------------------------+--------+
|  1 | На завтрак у меня были фрукты                       |      0 |
|  2 | На завтрак у меня вишня , яблоко , персик, и груша. |      1 |
+----+-----------------------------------------------------+--------+
→ Ссылка