Sql 比较两个字符串是否包含相同的单词
我有两条线: “一二三” 及 “二一三” 虽然它们不一样,但如果我直接比较它们,它们分别包含的值是相同的,这对我来说很重要。因此,我对比较的回答是字符串相等。 我正在寻找更直接的方法来比较它们,而不需要创建函数来分割和比较每个单独的值。有这样的解决办法吗 我在stackoverflow中发现了此线程: 它对我不起作用,因为我想在cte中进行这一比较,然后再进行其他比较。-..>SQL2017Sql 比较两个字符串是否包含相同的单词,sql,sql-server,string,string-comparison,Sql,Sql Server,String,String Comparison,我有两条线: “一二三” 及 “二一三” 虽然它们不一样,但如果我直接比较它们,它们分别包含的值是相同的,这对我来说很重要。因此,我对比较的回答是字符串相等。 我正在寻找更直接的方法来比较它们,而不需要创建函数来分割和比较每个单独的值。有这样的解决办法吗 我在stackoverflow中发现了此线程: 它对我不起作用,因为我想在cte中进行这一比较,然后再进行其他比较。-..>SQL2017 declare @t table(col varchar(400)); insert into @t(c
declare @t table(col varchar(400));
insert into @t(col) values('one three two'), ('three two one'), ('one two three'), (' one two two three three ');
select *,
(
/*
select string_agg(value, ' ') within group (order by value)
from openjson(concat('["', replace(string_escape( col, 'json' ) , ' ', '","'), '"]'))
where value <> ''
*/
select string_agg(value, ' ') within group (order by value)
from
(
select distinct value
from openjson(concat('["', replace(string_escape(col, 'json' ) , ' ', '","'), '"]'))
where value <> ''
) as s
) as rearranged
from @t;
您必须拆分字符串,否则如何比较单独的部分
我假设您希望找到所有匹配的项目对。我已经用一个表中的自联接展示了这一点,但您也可以从两个表中同样地进行自联接
这是一个问题,对此有许多解决办法
声明@t table val varchar100;
插入@tcol值“一三二”、“三二一”、“一二三”、“一二二三三”;
挑选*
从@t t1开始
将@t2连接到存在的位置
选择1
从字符串_SPLITt1.val,'s1
左连接字符串_SPLITt2.val',s2上的s2.value=s1.value
当s2.value为空时具有COUNTCASE,则1=0
和COUNT*=从字符串_SPLITt2.val“中选择COUNT*”
;
挑选*
从@t t1开始
加入@t t2 ON
按s1.value在组顺序中选择字符串_AGGs1.value“”
从字符串_SPLITt1.val,'s1
=
按s2.value在组顺序中选择字符串_AGGs2.value“”
从字符串_SPLITt2.val,'s2
;
使用T-SQL和XQuery相对容易实现。特别是通过使用XQuery的量化表达式 以下是它的工作原理: 将输入世界列表转换为XML,即标记化过程。 运行量化表达式。单词的顺序是不相关的。 计算源和目标中的字数。 2和3的结果都是最终结果。 SQL
根据问题指南,请说明您尝试了什么,并告诉我们您在本网站或其他网站上找到了什么,以及为什么它不符合您的需要。您需要使用字符串拆分器拆分字符串,然后确保该值存在于另一个也被拆分的字符串中。老实说,T-SQL远远不是最好的语言选择。我想在cte中随时进行比较。在这种情况下,我建议创建一个用户定义的函数来封装拆分和比较。或者创建一个分解、排序和重新联接的转换函数,然后为每个字符串调用一次,并比较两个转换的结果->请参见您自己发布的链接中的dbo.StringSorter。这属于我定义的简单,或者仍然是最简单的方法。如果另一个字符串是两三四或一二三四,你会得到什么结果want@Charlieface这是错误的。
-- DDL and sample data population, start
DECLARE @tbl TABLE( ID INT IDENTITY PRIMARY KEY, WordList1 VARCHAR(1024), WordList2 VARCHAR(1024));
INSERT INTO @tbl (WordList1, WordList2) VALUES
('one two three', 'two one three'),
('one two three', 'two one three '),
('one two three', ' one two two three three');
-- DDL and sample data population, end
DECLARE @Separator CHAR(1) = SPACE(1);
;WITH rs AS
(
SELECT *
, TRY_CAST('<root><source><r>' + REPLACE(WordList1, @Separator, '</r><r>') + '</r></source>'
+ '<target><r>' + REPLACE(WordList2, @Separator, '</r><r>') + '</r></target></root>' AS XML) AS xmldata
FROM @tbl
)
SELECT *
, xmldata.value('every $x in /root/source/r[text()]/text()
satisfies ($x = (/root/target/r[text()]/text())
and (count(/root/source/r[text()]) eq count(/root/target/r[text()])))', 'BIT') AS result
FROM rs;
+----+-----------------+---------------------------+--------+
| ID | WordList1 | WordList2 | result |
+----+-----------------+---------------------------+--------+
| 1 | one two three | two one three | 1 |
| 2 | one two three | two one three | 1 |
| 3 | one two three | one two two three three | 0 |
+----+-----------------+---------------------------+--------+