Поиск по некоторому сценарию - PullRequest
0 голосов
/ 30 апреля 2019

В SQL Server есть таблица, скажем, TableA с 2 столбцами (имя и описание) и данные в ней имеют вид:

Name          Description
Person1       Description1
Person2       Description2
Person12      Description12

, и у меня есть строка поиска = "Person + 1" Итак,что он будет делать, он ищет все значения в таблице, где имя или поле описания содержит «Персона» и «1», т. е. значения поиска разделяются пробелами

Я пытаюсь разбить строку поиска на основе '+'и затем пытаюсь сравнить все значения из таблицы, которые удовлетворяют моему желаемому условию

Declare @searchstring varchar(50)
set @searchstring='Person+1'

Select *
from TableA
where Name In Split(searchstring,'+') or
      Description In Split(searchstring,'+')

Ожидаемый результат:

Name          Description
Person1       Description1
Person12      Description12

Ответы [ 4 ]

0 голосов
/ 02 мая 2019

Функция разделения такая же, как у @ Aamir.Пожалуйста, см. Выше.

Часть запроса:

SELECT t1.[name]
FROM #Table1 t1
CROSS APPLY #Table2 t2
GROUP BY t1.[name]
HAVING SUM(CASE WHEN (t1.[name] LIKE '%' + t2.[name] + '%') THEN 1 ELSE 0 END) = (SELECT COUNT(*) FROM #Table2)
0 голосов
/ 30 апреля 2019

Сначала вы должны создать эту функцию (которую я нашел в интернете)

CREATE FUNCTION [dbo].[SplitLike](@String varchar(MAX), @Delimiter char(1), @StrVal varchar(50), @EndVal varchar(50))
returns @temptable TABLE (items varchar(MAX))       
as       
begin      
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@StrVal + @slice + @EndVal)

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return 
end;

Теперь здесь идет запрос

--Search Query
DECLARE @query AS VARCHAR(100) = 'Person+2'

--Create Temp Table
DECLARE @Prefixes TABLE (Prefix VARCHAR(100))

--Calling SplitLike function to get each item with '%' to apply like operator
INSERT INTO @Prefixes (Prefix)
SELECT * FROM [dbo].[SplitLike](@query, '+', '%', '%')

SELECT DISTINCT Search.* FROM Search 
LEFT JOIN @Prefixes pfn ON Search.Name LIKE pfn.Prefix 
LEFT JOIN @Prefixes pfd ON Search.[Description] LIKE pfd.Prefix
0 голосов
/ 30 апреля 2019

Вы можете использовать функцию Simple Replace для замены разделенного символа в строке поиска.

Declare @searchstring varchar(50)
set @searchstring='Person+1'

Select *
from TableA
where (Name LIKE REPLACE(@searchstring,'+','')+'%' or
      Description LIKE REPLACE(@searchstring,'+','')+'%')
0 голосов
/ 30 апреля 2019

Я думаю, что вам нужен следующий синтаксис:

Select *
from TableA
where Name In (select value from Split(@searchstring, '+')) or
      Description In (select value from Split(searchstring, '+'));

До выхода SQL Server 2016 вам нужно найти собственную функцию split().В сети много примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...