SQL: Разделение столбца в несколько слов для поиска ввода данных пользователем

Я хочу сравнить отдельные слова от ввода данных пользователем до отдельных слов из столбца в моей таблице.

Например, рассмотрите эти строки в моей таблице:

ID Name
1  Jack Nicholson
2  Henry Jack Blueberry
3  Pontiac Riddleson Jack

Полагайте, что входом пользователя является 'Pontiac Jack'. Я хочу присвоить веса/разряды для каждого соответствия, таким образом, я не могу использовать слой КАК (ГДЕ Имя КАК @SearchString).

Если Понтиак присутствует в какой-либо строке, я хочу наградить его 10 точками. Каждое соответствие для Jack понимает еще 10 мыслей и т.д. Таким образом, строка 3 поняла бы 20 мыслей, и строки 1 и 2 добираются 10.

Я разделил ввод данных пользователем на отдельные слова и сохранил их во временную таблицу @SearchWords (Word).

Но я не могу выяснить способ иметь оператор SELECT, который позволяет мне комбинировать это. Возможно, я иду об этом неправильным путем?

С наилучшими пожеланиями, WT

10
задан Donnie Thomas 26 June 2010 в 11:12
поделиться

5 ответов

Для SQL Server попробуйте следующее:

SELECT Word, COUNT(Word) * 10 AS WordCount
FROM SourceTable
INNER JOIN SearchWords ON CHARINDEX(SearchWords.Word, SourceTable.Name) > 0
GROUP BY Word
1
ответ дан 4 December 2019 в 04:53
поделиться

Что насчет этого? (это синтаксис MySQL, я думаю, вам нужно только заменить CONCAT и сделать это с помощью +)

SELECT names.id, count(searchwords.word) FROM names, searchwords WHERE names.name LIKE CONCAT('%', searchwords.word, '%') GROUP BY names.id

Тогда у вас будет результат SQL с идентификатором таблицы имен и подсчетом слов, соответствующих этому идентификатору.

0
ответ дан 4 December 2019 в 04:53
поделиться

Мне кажется, что лучше всего было бы вести отдельную таблицу со всеми отдельными словами. Например:

ID     Word       FK_ID
1      Jack       1
2      Nicholson  1
3      Henry      2
(etc)

Эта таблица будет поддерживаться в актуальном состоянии с помощью триггеров, и у вас будет некластеризованный индекс на 'Word', 'FK_ID'. Тогда SQL для создания весовых коэффициентов будет простым и эффективным.

0
ответ дан 4 December 2019 в 04:53
поделиться

Как насчет чего-то вроде этого ....

Select id, MAX(names.name), count(id)*10 from names
inner join @SearchWords as sw on 
    names.name like '%'+sw.word+'%'
group by id 

если предположить, что таблица с именами называется "names".

0
ответ дан 4 December 2019 в 04:53
поделиться

Вы можете сделать это с помощью обычного табличного выражения, которое вычисляет весовые коэффициенты. Например:

--** Set up the example tables and data
DECLARE @Name TABLE (id INT IDENTITY, name VARCHAR(50));
DECLARE @SearchWords TABLE (word VARCHAR(50));

INSERT INTO @Name
        (name)
VALUES  ('Jack Nicholson')
       ,('Henry Jack Blueberry')
       ,('Pontiac Riddleson Jack')
       ,('Fred Bloggs');

INSERT INTO @SearchWords
        (word)
VALUES  ('Jack')
       ,('Pontiac');

--** Example SELECT with @Name selected and ordered by words in @SearchWords
WITH Order_CTE (weighting, id)
AS (
    SELECT COUNT(*) AS weighting
         , id 
      FROM @Name AS n
      JOIN @SearchWords AS sw
        ON n.name LIKE '%' + sw.word + '%' 
     GROUP BY id
)
SELECT n.name
     , cte.weighting
  FROM @Name AS n
  JOIN Order_CTE AS cte
    ON n.id = cte.id
 ORDER BY cte.weighting DESC;

Используя эту технику, вы также можете применить значение к каждому поисковому слову, если хотите. Так что вы можете сделать Джека более ценным, чем Понтиак. Это будет выглядеть примерно так:

--** Set up the example tables and data
DECLARE @Name TABLE (id INT IDENTITY, name VARCHAR(50));
DECLARE @SearchWords TABLE (word VARCHAR(50), value INT);

INSERT INTO @Name
        (name)
VALUES  ('Jack Nicholson')
       ,('Henry Jack Blueberry')
       ,('Pontiac Riddleson Jack')
       ,('Fred Bloggs');

--** Set up search words with associated value
INSERT INTO @SearchWords
        (word, value)
VALUES  ('Jack',10)
       ,('Pontiac',20)
       ,('Bloggs',40);


--** Example SELECT with @Name selected and ordered by words and values in @SearchWords
WITH Order_CTE (weighting, id)
AS (
    SELECT SUM(sw.value) AS weighting
         , id 
      FROM @Name AS n
      JOIN @SearchWords AS sw
        ON n.name LIKE '%' + sw.word + '%' 
     GROUP BY id
)
SELECT n.name
     , cte.weighting
  FROM @Name AS n
  JOIN Order_CTE AS cte
    ON n.id = cte.id
 ORDER BY cte.weighting DESC;      
0
ответ дан 4 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: