Поиск строки, если она содержит все подстроки в sql - PullRequest
1 голос
/ 02 мая 2019

У меня есть одна таблица (скажем, table1), и у меня есть значения в поле «Имя», например: «Меня зовут Викаш», «Меня зовут VGH», «У меня есть hjk», а во второй таблице (скажем, table2) есть значения вПоле «Имя», например: «Мое», «имя». И мне нужен результат «Мое имя Викаш» и «Мое имя VGH»

Я пытался проверить значения из первой таблицы, еслидля сравнения он содержит все значения из второй таблицы, но LIKE сравнивает только одно значение. Мне нужна функция сравнения нескольких значений

Select  table1.Name from table1
where table1.Name Like(Select Name from Table2)

Итак, получилось, что значения из первой таблицы проверяются, если она содержит всезначения из второй таблицы. И если он содержит все значения из второй таблицы, мне нужно значение этой первой таблицы в результате

Ответы [ 4 ]

3 голосов
/ 02 мая 2019

Вы можете попытаться подсчитать совпадения, используя CROSS APPLY:

Ввод:

CREATE TABLE #Table1 (
   [name] nvarchar(max)
)
CREATE TABLE #Table2 (
   [name] nvarchar(100)
)

INSERT INTO #Table1
   ([name])
VALUES
   ('My name is Vikash'),
   ('My name is VGH'),
   ('My name is VG3'),
   ('My name is VG4'),
   ('I have hjk')
INSERT INTO #Table2
   ([name])
VALUES
   ('My'),
   ('name'),
   ('VGH')

T-SQL (для частичного совпадения):

SELECT t1.[name]
FROM #Table1 t1
CROSS APPLY #Table2 t2
GROUP BY t1.[name]
HAVING SUM(CASE WHEN (t1.[name] LIKE '%' + t2.[name] + '%') THEN 1 ELSE 0 END) > 0

Выходные данные:

------------------
name
------------------
My name is VG3
My name is VG4
My name is VGH
My name is Vikash

T-SQL (для полного соответствия):

SELECT t1.[name]
FROM #Table1 t1
CROSS APPLY #Table2 t2
GROUP BY t1.[name]
HAVING SUM(CASE WHEN (t1.[name] LIKE '%' + t2.[name] + '%') THEN 1 ELSE 0 END) = (SELECT COUNT(*) FROM #Table2)

Выходные данные:

------------------
name
------------------
My name is VGH
1 голос
/ 02 мая 2019

Это даст ожидаемые результаты, я думаю.Пожалуйста, просто игнорируйте столбец RN из вашего окончательного набора результатов.

SELECT DISTINCT A.Name,A.RN 
FROM
(
    SELECT 
    'A' AS COMMON,
    Name,
    RANK() OVER(PARTITION BY Name ORDER BY Name) RN
    FROM Table1
)A
INNER JOIN 
(   
    SELECT 
    'A' AS COMMON,
    Name 
    FROM table2
)B
ON A.Common = B.Common
WHERE CHARINDEX(B.Name,A.Name,0) > 0
1 голос
/ 02 мая 2019

Я думаю, вы ищете что-то вроде:

SELECT DISTINCT T1.Name FROM table1 AS T1
INNER JOIN table2 AS T2
ON T1.Name LIKE CONCAT("%", T2.Name, "%");
1 голос
/ 02 мая 2019

Как насчет этого?Выберите отдельные имена из tbl1 и используйте JOIN для tbl2, используя LIKE.Мы должны использовать Distinct, так как в противном случае вы получите несколько результатов из одних и тех же значений в tbl1 (поскольку оба значения My и Name совпадают).

SELECT DISTINCT t1.name
FROM tbl1 t1
JOIN tbl2 t2
  ON t1.name LIKE CONCAT('%', t2.name, '%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...