Согласование терминов с использованием SQL - PullRequest
0 голосов
/ 25 июня 2018

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

Например, «это кот» - это текст в базе данных.Если я ищу "кошка" или "кошка", она должна вернуть данные, но ничего не должна возвращать, если я искала "кошку" или "кошку".

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

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вы можете попробовать код ниже, надеюсь, это поможет вам.

Declare @InputString Varchar(50) = 'a cat'  --<-- String comming in

Declare @Table TABLE (Strings Varchar(50))  --<-- String in the Database
Insert Into @Table Values ('this is a cat')

-- Convert to XML Input sting
declare @xml xml = N'<root><r>' + replace(@InputString, ' ','</r><r>') +     '</r></root>';


WITH DBString AS (

-- Split string stored in the database

SELECT  RTRIM(LTRIM(Split.a.value('.', 'VARCHAR(100)'))) Strings 
FROM   
(SELECT Cast ('<X>' + Replace(Strings, ' ', '</X><X>') + '</X>' AS XML) AS Data
FROM    @Table
) AS t CROSS APPLY Data.nodes ('/X') AS Split(a) )
,InputStrings AS
(

-- Split String coming in the parameter

select RTRIM(LTRIM(r.value('.','varchar(max)'))) as InputString
from @xml.nodes('//root/r') as records(r)
 )

-- Finally Compare the splitted  strings word by word

select 1 from (
SELECT COUNT(1) t1, (SELECT count(1) 
          FROM InputStrings) t2
FROM InputStrings
WHERE EXISTS (SELECT 1 
          FROM DBString
          WHERE InputStrings.InputString = DBString.Strings)
         ) TBF where tbf.t1=TBF.t2
0 голосов
/ 25 июня 2018

Что-то вроде этого, возможно?

DECLARE @text NVARCHAR(400) = 'this is a cat'  
DECLARE @search NVARCHAR(400) = 'a cat'  

SELECT t.value  
FROM STRING_SPLIT(@text, ' ') t
join STRING_SPLIT(@search, ' ') s
on t.value = s.value
WHERE RTRIM(t.value) <> '' and RTRIM(s.value) <> '';

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

Вам понадобится Sql-сервер 2016 или выше, чтобы STRING_SPLIT заработал.

В случае более низких версий sql вам потребуется создать UDF для разбиения строки. Один такой:

CREATE FUNCTION dbo.fnSplit(
    @sInputList VARCHAR(8000) -- List of delimited items
  , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(8000))

BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
 BEGIN
 SELECT
  @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
  @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

 IF LEN(@sItem) > 0
  INSERT INTO @List SELECT @sItem
 END

IF LEN(@sInputList) > 0
 INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
GO

И вышеупомянутый запрос становится:

DECLARE @text NVARCHAR(400) = 'this is a cat'  
DECLARE @search NVARCHAR(400) = 'a cat'  

SELECT t.Item  
FROM fnSplit(@text, ' ') t
join fnSplit(@search, ' ') s
on t.Item = s.Item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...