Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 比较两个字符串是否包含相同的单词_Sql_Sql Server_String_String Comparison - Fatal编程技术网

Sql 比较两个字符串是否包含相同的单词

Sql 比较两个字符串是否包含相同的单词,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

我有两条线:

“一二三”

“二一三”

虽然它们不一样,但如果我直接比较它们,它们分别包含的值是相同的,这对我来说很重要。因此,我对比较的回答是字符串相等。 我正在寻找更直接的方法来比较它们,而不需要创建函数来分割和比较每个单独的值。有这样的解决办法吗

我在stackoverflow中发现了此线程:

它对我不起作用,因为我想在cte中进行这一比较,然后再进行其他比较。

-..>SQL2017

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 |
+----+-----------------+---------------------------+--------+