Предоставить значения для «подобной» функции из определенного столбца в таблице? - PullRequest
1 голос
/ 04 октября 2019

Я использую SQL Server 2014, и мне нужен запрос T-SQL, который использует функцию like для запуска в определенном столбце (c1) таблицы (t1), чтобы выяснить, содержит ли он один из кодов изсписок кодов, найденных в столбце (c2) другой таблицы (t2).

Для упрощения, вот сценарий и ожидаемый результат:

Таблица t1:

ID       Notes
101      (free text in this column)
102      ...
...      ...
115000   ...

Таблица t2 (список из более чем 300 кодов):

Code
FR110419
GB150619
...
DE111219

Что я ищу:

SELECT ID 
FROM t1
WHERE t1.Notes like (SELECT Code FROM t2)

Так как оператору like требуется '%' для работы,Я не понимаю, как построить эту линию.

Я провел некоторое исследование по StackOverflow, и самое близкое решение, с которым я столкнулся, - это проблема mysql: как использовать LIKE симя столбца

Любая помощь будет наиболее полезной.

Ответы [ 3 ]

3 голосов
/ 04 октября 2019

Вы, похоже, ищете JOIN:

SELECT ID 
FROM t1
INNER JOIN t2 ON t1.Notes LIKE '%' + t2.Code + '%'

Если в одном и том же Note могут появляться разные Code s, использование условия EXISTS с коррелированным подзапросом такжевозможность избежать дублирования записей в выходных данных:

SELECT ID
FROM t1
WHERE EXISTS (
    SELECT 1 FROM t2 WHERE t1.Notes LIKE '%' + t2.Code + '%'
)
1 голос
/ 04 октября 2019

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

Использование выборочных данных CTE6 ...

--Loading data
create table t1 (id varchar(10));
insert into t1 (id) values ('100100'),('200100'),('300100')
insert into t1 (id) values ('100200'),('200200'),('300200')
insert into t1 (id) values ('100300'),('200300'),('300300')
insert into t1 (id) values ('0100'),('0200'),('0300')
insert into t1 (id) values ('00010'),('00020'),('00030')

create table t2 (id varchar(10));
insert into t2 (id) values ('020'),('010')
GO

--  The View
CREATE VIEW dbo.vw_t1t2 WITH SCHEMABINDING AS
SELECT     t1 = t1.id, t2 = t2.id, cb = COUNT_BIG(*)
FROM       dbo.t1 AS t1
CROSS JOIN dbo.t2 AS t2
WHERE      CHARINDEX(t2.id,t1.id) > 0
GROUP BY   t1.id, t2.id
GO
-- The index (may need to add something else to make UNIQUE)
CREATE UNIQUE CLUSTERED INDEX uq_cl_vwt1t2 ON dbo.vw_t1t2(t1,t2);
GO

Это будет очень хорошо работать для операторов SELECT, но может повлиять на изменения данных в отношении t1 и t2, поэтому убедитесь, что используется наименьший возможный тип данных и тольковключите столбцы, которые вы уверены, что вам нужно (Varchar (10) хорошо). Я включил COUNT_BIG (), потому что это требуется в индексированных представлениях, использующих GROUP BY.

1 голос
/ 04 октября 2019

Вы можете использовать cross apply с charindex следующим образом:

--Loading data
create table t1 (id varchar(10));
insert into t1 (id) values ('100100'),('200100'),('300100')
insert into t1 (id) values ('100200'),('200200'),('300200')
insert into t1 (id) values ('100300'),('200300'),('300300')
insert into t1 (id) values ('0100'),('0200'),('0300')
insert into t1 (id) values ('00010'),('00020'),('00030')

create table t2 (id varchar(10));
insert into t2 (id) values ('020'),('010')

select t.id
from t1 as t
cross apply t2 as t2
--where charindex(t2.id,t.id) > 0 -- simulates a double % one at the beginning and one at the end
--where charindex(t2.id,t.id) = 1 -- simulates a % at the beginning
where charindex(t2.id,t.id) = len(t.id)-len(t2.id)+1 -- simulates a % at the end

Единственное, что стол очень большой, это может быть медленным решением.

...