Поиск по таблице из столбца с разделителями-запятыми с использованием SQL - PullRequest
0 голосов
/ 17 октября 2019

У меня есть данные в следующем формате, я хотел бы найти пользователей, которые соответствуют любому и всем словам в столбце навыков, разделенных запятыми:

Name    | id   | skills                               |
-------------------------------------------------------
Bbarker | 5987 | Needles, Pins, Surgery, Word, Excel  |
CJerald | 5988 | Bartender, Shots                     |
RSarah  | 5600 | Pins, Ground, Hot, Coffee            |

Так что, если я ищу "Иглы", Pins ", он должен возвращать строки Bbarker и RSarahs.

Как мне добиться чего-то подобного с помощью SQL?

Я даже не знаю, с чего начать и что искать, любую помощь вправильное направление было бы здорово!

Спасибо!

Ответы [ 2 ]

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

Плохой дизайн в стороне, иногда мы застряли и вынуждены иметь дело с этим плохим дизайном.

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

Если вы используете SQL Server версии 2016+, есть встроенный вызов функции STRING_SLIT () , который можно использовать. Если вы работаете до SQL Server 2016, вам в основном нужно конвертировать в XML в качестве обходного пути

Вот рабочий пример того, что вы можете изучить:

DECLARE @TestData TABLE
    (
        [Name] NVARCHAR(100)
      , [Id] INT
      , [skills] NVARCHAR(100)
    );
--Test data
INSERT INTO @TestData (
                          [Name]
                        , [Id]
                        , [skills]
                      )
VALUES ( 'Bbarker', 5987, 'Needles, Pins, Surgery, Word, Excel' )
     , ( 'CJerald', 5988, 'Bartender, Shots' )
     , ( 'RSarah', 5600, 'Pins, Ground, Hot, Coffee' );

--search words
DECLARE @Search NVARCHAR(100) = 'Needles, Pins';

--sql server 2016+ using STING_SPLIT
SELECT      DISTINCT [a].*
FROM        @TestData [a]
CROSS APPLY STRING_SPLIT([a].[skills], ',') [sk]  --split your column
CROSS APPLY STRING_SPLIT(@Search, ',') [srch] --split your search
WHERE       LTRIM(RTRIM([sk].[value])) = LTRIM(RTRIM([srch].[value]));  --filter where they equal

--Prior to sql server 2016, convert XML
SELECT      DISTINCT [td].*
FROM        @TestData [td]
--below we are converting to xml and then spliting those out for your column
CROSS APPLY (
                SELECT      [Split].[a].[value]('.', 'NVARCHAR(MAX)') [value]
                FROM        (
                                SELECT CAST('<X>' + REPLACE([td].[skills], ',', '</X><X>') + '</X>' AS XML) AS [String]
                            ) AS [A]
                CROSS APPLY [String].[nodes]('/X') AS [Split]([a])
            ) AS [sk]
--same here for the search
CROSS APPLY (
                SELECT      [Split].[a].[value]('.', 'NVARCHAR(MAX)') [value]
                FROM        (
                                SELECT CAST('<X>' + REPLACE(@Search, ',', '</X><X>') + '</X>' AS XML) AS [String]
                            ) AS [A]
                CROSS APPLY [String].[nodes]('/X') AS [Split]([a])
            ) AS [srch]
WHERE       LTRIM(RTRIM([sk].[value])) = LTRIM(RTRIM([srch].[value])); --then as before where those are equal 

Оба получат вывод:

Name        Id       skills
----------  -------  ------------------------------------
Bbarker     5987     Needles, Pins, Surgery, Word, Excel
RSarah      5600     Pins, Ground, Hot, Coffee
0 голосов
/ 17 октября 2019

Как насчет этого?

SELECT DISTINCT Name, id
  FROM table
 WHERE skills LIKE '%Needles%'
    OR skills LIKE '%Pins%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...