Существует ли оператор LIKE для динамического списка или набора нескольких строк в MS SQL Server? - PullRequest
0 голосов
/ 24 сентября 2019

Предположим, у меня есть набор результатов только из одного столбца, содержащего substrings:

Table1:

substrings
-----------
substringa
substringb
substringc
substringd
substringe
etc.
-----------

И у меня есть второй набор результатов из другого запроса:

Table2:

id      | comment
-------------------------------------------------------------------------------
0001    | A text containing substringa
0002    | A text containing substringd
0003    | A text containing none of the substrings from Table1
0004    | Another text containing substringa
0005    | A text containing substringb
...     | etc.
-------------------------------------------------------------------------------

Я хочу вернуть третью таблицу, Table3, содержащую строки в Table2, где комментарий содержит любой из substrings, существующий в Table1, включая другой столбец с существующим substrings сам, то есть:

Table3:

id      | comment                                | substrings
-------------------------------------------------------------------------------
0001    | A text containing substringa           | substringa
0002    | A text containing substringd           | substringd
0004    | Another text containing substringa     | substringa
0005    | A text containing substringb           | substringb
...     | etc.                                   | ...
-------------------------------------------------------------------------------

Можно предположить, что все комментарии в Table2 содержат ровно ноль или одну из подстрок в Table1.Я пытался найти решение с использованием комбинации операторов charindex, substring, exists или like, но не смог найти какое-либо решение, и у MS SQL Server нет подходящего оператора regexp, о котором я знаю,Есть ли что-то похожее на оператор like для проверки нескольких строк в MS SQL Server, или есть более эффективные способы сделать это?Размер substrings в Таблице 1 имеет порядок 10 ^ 2-10 ^ 3 и динамически изменяется, поэтому я не могу жестко закодировать, как описано в этом сообщении .

Ответы [ 2 ]

3 голосов
/ 24 сентября 2019

Одним из решений было бы использование CHARINDEX(), чтобы проверить, содержит ли строка другую строку:

SELECT t2.*, t1.substring
FROM table2 t2
INNER JOIN table1 t1 ON CHARINDEX(t1.substring, t2.comment) > 0

Если вы хотите видеть также комментарии, которые не имеют совпадающей подстроки, вы можете использовать LEFT JOIN вместо INNER JOIN.

LIKE также выполнят работу:

SELECT t2.*, t1.substring
FROM table2 t2
INNER JOIN table1 t1 ON t2.comment LIKE CONCAT('%', t1.substring, '%')
1 голос
/ 24 сентября 2019

Вы можете попробовать использовать этот запрос:

SELECT t2.*, t1.substring
FROM table2 t2
INNER JOIN table1 t1 ON t2.comment LIKE '%' + t1.substring + '%'
...