Предположим, что эти две таблицы:
блог
id title keywords
1 Hello hello,world,test
2 Google search, email, security
3 Microsoft clippy, collaboration
категория
id keywords
1 test, world, clippy
Как искать строки блога, которые имеют одно или несколько ключевых слов, соответствующих ключевому слову в строке категории?
Кратко: если вы хотите выполнить эту операцию, вы не храните свои данные так. Вы нормализуете свои данные и выполняете поиск с использованием нормализованных данных:
CREATE TABLE Blog
(
id INTEGER NOT NULL PRIMARY KEY,
title VARCHAR(30) NOT NULL
);
INSERT INTO Blog(id, title) VALUES(1, 'Hello');
INSERT INTO Blog(id, title) VALUES(2, 'Google');
INSERT INTO Blog(id, title) VALUES(3, 'Microsoft');
CREATE TABLE BlogKeywords
(
id INTEGER NOT NULL,
keyword VARCHAR(20) NOT NULL,
PRIMARY KEY(keyword, id)
);
INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'hello');
INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'world');
INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'test');
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'search');
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'email');
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'security');
INSERT INTO BlogKeywords(id, keyword) VALUES(3, 'clippy');
INSERT INTO BlogKeywords(id, keyword) VALUES(3, 'collaboration');
CREATE TABLE Category
(
id INTEGER NOT NULL,
keyword VARCHAR(20) NOT NULL,
PRIMARY KEY(id, keyword)
);
INSERT INTO Category(id, keyword) VALUES(1, 'test');
INSERT INTO Category(id, keyword) VALUES(1, 'world');
INSERT INTO Category(id, keyword) VALUES(1, 'clippy');
Теперь вы можете легко искать, используя простые соединения:
SELECT DISTINCT b.id AS BlogID, b.Title, c.id AS CategoryID
FROM Blog AS b
JOIN BlogKeywords AS K ON b.id = k.id
JOIN Category AS C ON k.keyword = c.keyword;
Не совсем понятно, что вы хотите увидеть, если есть несколько категорий.
Я не вижу хорошего способа, используя простой запрос. Если у вас действительно есть такая модель данных, единственный способ, которым я вижу, - это перемещаться по таблице и сопоставлять каждую строку самостоятельно. Вы можете сделать это в хранимой процедуре или из кода клиента. Да, это будет ужасно, но механизм запросов не может сделать ничего лучше. Обязательно используйте курсор и не загружайте всю таблицу в свою память приложения.