Как определить, какой шаблон в предложении где соответствует - PullRequest
3 голосов
/ 19 февраля 2012

Мне нужна помощь по T-SQL. У меня есть хранимая процедура в моем SQL Server с запросом (образец), как показано ниже:

Select empid, empname, sal from emp
  where empname like '%jo%'
  and   empname like '%el%'

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

empid empname sal   
17    john    $1000
45    elena   $2000

Мне нужен еще один столбец для вышеприведенного оператора выбора, который должен содержать 'jo' для %jo% записи и 'el' для %el% записи. Например:

empid empname sal     SearchString
17    john    $1000   jo
45    elena   $2000   el

Возможно ли это?

Спасибо

Ответы [ 4 ]

1 голос
/ 19 февраля 2012

Для удовлетворения нескольких условий вы можете использовать CTE

  • для создания таблицы в памяти
  • присоединить фактическую таблицу к этой таблице в памяти
  • получить условие в предложении выбора

Оператор SQL

;WITH Conditions (SearchString) AS (
  SELECT 'jo' UNION ALL
  SELECT 'el'
)
SELECT  empid
        , empname
        , sal
        , Searchstring
FROM    emp e
        INNER JOIN Conditions c ON e.empname LIKE '%' + c.SearchString + '%'

Тестовый скрипт

;WITH Conditions (SearchString) AS (
  SELECT 'jo' UNION ALL
  SELECT 'el'
)
, emp (empid, empname, sal) AS (
    SELECT 17, 'john', 1000 UNION ALL
    SELECT 45, 'elena', 2000
)
SELECT  empid
        , empname
        , sal
        , Searchstring
FROM    emp e
        INNER JOIN Conditions c ON e.empname LIKE '%' + c.SearchString + '%'
1 голос
/ 19 февраля 2012

Что-то похожее на это будет работать, заметив, что вы можете передать параметр в сохраненный процесс

declare @empname varchar(255)
set @empname = 'jo'

Select empid, empname, sal, @empname as searchstring from emp 
  where empname like '%'+@empname+'%'
0 голосов
/ 19 февраля 2012

Во-первых, если вам нужно разобрать строки, разделенные запятыми, у вас должна быть функция split. Вот тот, который я использую:

CREATE FUNCTION [dbo].[SplitStrings]
(
   @List       NVARCHAR(MAX)
)
RETURNS TABLE
AS
   RETURN ( SELECT Item FROM (
     SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)')
        FROM ( SELECT [XML] = CONVERT(XML, '<i>' 
                + REPLACE(@List, ',', '</i><i>') 
                + '</i>').query('.') ) AS a 
        CROSS APPLY [XML].nodes('i') AS x(i)
    ) AS y WHERE Item IS NOT NULL
   );
GO

Теперь, если вы хотите выбрать произвольное совпадение в случае нескольких совпадений, вы можете сказать:

CREATE PROCEDURE dbo.Search
    @SearchStrings NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    ;WITH x AS (
        SELECT e.empid, e.empname, e.sal, SearchString = s.Item,
            rn = ROW_NUMBER() OVER (PARTITION BY e.empid ORDER BY s.Item)
        FROM dbo.emp AS e
        INNER JOIN dbo.SplitStrings(@SearchStrings) AS s
        ON e.empname LIKE '%' + s.Item + '%'
    ) 
    SELECT empid, empname, sal, SearchString
    FROM x WHERE rn = 1 ORDER BY empid;
END
GO

(Это вернет первое алфавитное совпадение в вашем параметре @SearchStrings, а не первое совпадение в порядке вашей строки, разделенной запятыми.)

Если вам просто нужны все строки, даже если сотрудник использует более одного из переданных шаблонов (что означает, что 'john' будет возвращено дважды, если ваш параметр 'jo,oh'), вы можете просто сказать:

CREATE PROCEDURE dbo.Search
    @SearchStrings NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT e.empid, e.empname, e.sal, SearchString = s.Item
      FROM dbo.emp AS e
      INNER JOIN dbo.SplitStrings(@SearchStrings) AS s
      ON e.empname LIKE '%' + s.Item + '%'
      ORDER BY empid;
END
GO

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

0 голосов
/ 19 февраля 2012

Похоже, вы хотите знать, какая строка поиска соответствует любой заданной выходной строке.Не учитывая возможность сопоставления более чем одной строки поиска, например, empname 'Joel', должно работать следующее:

declare @emp as table (empid int, empname varchar(10), sal money)
insert into @emp ( empid, empname, sal ) values
  ( 17, 'john', 1000 ),
  ( 45, 'elena', 2000 )

select empid, empname, sal,
  case
    when empname like '%jo%' then 'jo'
    when empname like '%el%' then 'el'
    else '?'
    end as SearchString
  from @emp
  where empname like '%jo%' or empname like '%el%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...