Как найти строку в базе данных которая содержит все слова из массива слов 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 |
+----+-----------------------------------------------------+--------+