在T-SQL中逐字逐句比较的功能

时间:2015-06-10 14:08:15

标签: sql-server substring sql-function

我需要编写一个SQL Server函数,它将接收两个字段并以这种方式执行逻辑操作 - 取第一个字段值,将其拆分为单词
- 确保所有这些单词都存在于第二个字段中。

例如:le chien的第一个字段,第二个字段是le chien joue avec la balle 在这种情况下,该函数将返回true,因为第一个中的所有单词都在第二个单词中。

我可以简单地使用SUBSTRING

SUBSTRING(field1, 0, 5)=SUBSTRING(field2, 0,5)

但在某些情况下它不起作用;如果field1la maison (1)field2la maison (2) SUBSTRING(field1, 0, 5)=SUBSTRING(field2, 0,5),则即使字符串不匹配也会返回true。

在某些情况下,字符数量的增加会起作用,但在其他情况下不会起作用。所以这一切都归结为编写一个函数,将第一个字符串拆分为单独的单词并确保它们全部存在于第二个字符串中。

有人可以帮助我建立一个功能或指向正确的方向吗?我真的很感激任何帮助

2 个答案:

答案 0 :(得分:1)

如果要查看value2中是否存在value1,可以使用CHARINDEX。 https://msdn.microsoft.com/en-us/library/ms186323.aspx

IF CHARINDEX(value1, value2) > 0  --found

如果值1中的单词可以在值2中以任何顺序排列,那么您可以使用JamesZ在您的问题中链接的分割函数。将该功能添加到数据库后,您可以使用

IF EXISTS(SELECT  * 
          FROM    dbo.DelimitedSplit8K(@value1, ' ')
          WHERE CHARINDEX(item, @value2 ) = 0) -- not found

答案 1 :(得分:0)

您可以检查以下解决方案是否符合您的要求

http://www.sqlservercentral.com/blogs/querying-microsoft-sql-server/2013/09/19/how-to-split-a-string-by-delimited-char-in-sql-server/

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END


----Select Statement
SELECT a.splitdata
INTO #firstSet
FROM fnSplitString('le chien', ' ') a

SELECT b.splitdata
INTO #secondSet
FROM fnSplitString('le joue avec la balle', ' ') b

DELETE a 
FROM #firstSet a
JOIN #secondSet b ON a.splitdata = b.splitdata

SELECT * FROM #firstSet


http://sqlfiddle.com/#!6/c5035