Запрос SQL с оператором like из двух таблиц - PullRequest
4 голосов
/ 21 января 2010

Как выполнить SQL-запрос с оператором like из двух разных таблиц?

Мне нужно что-то вроде:

select * from table1 where name like %table2.name

Это не обычное поле, а подстрока поля в другой таблице.

Ответы [ 3 ]

4 голосов
/ 21 января 2010

Редактировать

(оригинальный ответ ниже)

Ваш комментарий (и последующее редактирование) полностью меняет вопрос.

Для этого вы можете использовать LIKE как часть предложения ON в объединении:

CREATE TABLE a (foo varchar(254))
GO

CREATE TABLE b (id int, bar varchar(254))
GO

INSERT INTO a (foo) VALUES ('one')
INSERT INTO a (foo) VALUES ('tone')
INSERT INTO a (foo) VALUES ('phone')
INSERT INTO a (foo) VALUES ('two')
INSERT INTO a (foo) VALUES ('three')

INSERT INTO b (id, bar) VALUES (2, 'ne')
INSERT INTO b (id, bar) VALUES (3, 't')

SELECT a.foo
FROM a
INNER JOIN b ON a.foo LIKE '%' + b.bar
WHERE b.id = 2

(Это версия SQL Server; для MySQL добавьте различные точки с запятой, удалите GO s и используйте вместо него ...LIKE concat('%', b.bar).)

Использует id = 2 для поиска bar = "ne" в таблице b, затем добавляет оператор % и использует его для фильтрации результатов из a. Результаты:

one
tone
phone

Вам не придется делать конкат, если вы можете сохранить оператора в b.bar.

Отдельно я с удивлением обнаружил, что это также работает (на SQL Server):

SELECT foo
FROM a
WHERE foo LIKE (
    SELECT TOP 1 '%' + bar
    FROM b
    WHERE id = 2
)

... но версия, использующая JOIN, вероятно, более гибкая.

Это должно помочь вам.

Оригинальный ответ

(возможно, больше не актуально)

Трудно сказать, о чем вы спрашиваете, но вот пример использования LIKE для ограничения результатов от JOIN:

SELECT a.foo, b.bar
FROM someTable a
INNER JOIN someOtherTable b
    ON a.someField = b.someField
WHERE a.foo LIKE 'SOMETHING%'
AND b.bar LIKE '%SOMETHING ELSE'

Это даст вам foo из someTable и bar из someOtherTable, где строки связаны с someField, а foo начинается с "ЧТО-ТО", а bar заканчивается с "ЧТО-ТО ЕЩЕ" .

3 голосов
/ 21 января 2010

Не совсем уверен насчет точного синтаксиса, но вот идея:

select ... from (
    select ID, Foo as F from FooTable
    union all
    select ID, Bar as F from BarTable) R
where R.F like '%text%'
1 голос
/ 24 апреля 2012

На основании ответа @TJCrowder

Столы для испытаний

create table #A (
id varchar(10)
)


create table #b(
number varchar(5)
)

insert into #A values('123')
insert into #A values('456')
insert into #A values('789')
insert into #A values('0123')
insert into #A values('4567')

select * from #A

insert into #B values('12')
insert into #b values('45')
insert into #b values('987')
insert into #b values('012')
insert into #b values('666')

Фактический запрос

select * from #a, #b
where #a.id like '%' + #b.number + '%'

Измените приведенный выше запрос, как вам нужно, например

select #A.* from #A,#B ...
or
select * from #a, #b
where #a.id like  #b.number + '%'  -- one side match
...