T-SQL 中的逐字字符串比较函数
Function for word by word string comparison in T-SQL
我需要编写一个 SQL 服务器函数,它将接受两个字段并以这种方式执行逻辑操作
- 获取第一个字段值,将其拆分为单词
- 确保所有这些词都存在于第二个字段中。
例如:第一个字段为le chien
,第二个字段为le chien joue avec la balle
在这种情况下,该函数将 return 为真,因为第一个单词中的所有单词都在第二个单词中。
我可以简单地使用 SUBSTRING
:
SUBSTRING(field1, 0, 5)=SUBSTRING(field2, 0,5)
但在某些情况下是行不通的;如果我有 field1
作为 la maison (1)
和 field2
作为 la maison (2)
SUBSTRING(field1, 0, 5)=SUBSTRING(field2, 0,5)
将 return true 即使字符串不匹配。
在某些情况下增加字符数会奏效,但在其他情况下则行不通。所以这一切都归结为编写一个函数,将第一个字符串拆分为单独的单词,并确保所有单词都存在于第二个字符串中。
有人可以帮我构建一个功能或为我指明正确的方向吗?我真的很感激任何帮助
如果要查看value1 是否存在于value2 中,可以使用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
您能否检查以下解决方案是否符合您的要求
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
我需要编写一个 SQL 服务器函数,它将接受两个字段并以这种方式执行逻辑操作
- 获取第一个字段值,将其拆分为单词
- 确保所有这些词都存在于第二个字段中。
例如:第一个字段为le chien
,第二个字段为le chien joue avec la balle
在这种情况下,该函数将 return 为真,因为第一个单词中的所有单词都在第二个单词中。
我可以简单地使用 SUBSTRING
:
SUBSTRING(field1, 0, 5)=SUBSTRING(field2, 0,5)
但在某些情况下是行不通的;如果我有 field1
作为 la maison (1)
和 field2
作为 la maison (2)
SUBSTRING(field1, 0, 5)=SUBSTRING(field2, 0,5)
将 return true 即使字符串不匹配。
在某些情况下增加字符数会奏效,但在其他情况下则行不通。所以这一切都归结为编写一个函数,将第一个字符串拆分为单独的单词,并确保所有单词都存在于第二个字符串中。
有人可以帮我构建一个功能或为我指明正确的方向吗?我真的很感激任何帮助
如果要查看value1 是否存在于value2 中,可以使用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
您能否检查以下解决方案是否符合您的要求
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