【问题标题】:Comparings multiple parts of a string with separating characters `"` between two tables在两个表之间比较字符串的多个部分与分隔字符`"`
【发布时间】:2017-01-14 00:57:19
【问题描述】:

我有两张带字符串的表。现在,这些字符串由" 分隔的不同部分组成。例如:

表 1:

---------------------
| 1 | hello"world   |
---------------------
| 2 | hows"life"bro |
---------------------

表2:

-----------------------
| 1 | world"hello     |
-----------------------
| 2 | hows"bro"life   |
-----------------------

目前我收到这样的查询:

select * from table1 inner join table2 on table1.id = table2.id where table1.colum2 = table2.colum2

我需要的查询应该显示两行,因为如果你从 table1 更改 hello 和 world 你会得到 table2 包含的 world"hello。我怎样才能做到这一点?

提前致谢

【问题讨论】:

  • 总是用"隔开吗?
  • @Prdp 是的,它总是由"分隔

标签: sql sql-server


【解决方案1】:

您需要一个拆分字符串函数来执行此操作

;WITH tab1
     AS (SELECT *
         FROM   (VALUES ( 1,'hello"world' ),
                        (2,'hows"life"bro' )) t1 (id, NAME)
                CROSS apply (SELECT *
                             FROM   Delimitedsplit8k(t1.NAME, '"')) cs),
     tab2
     AS (SELECT *
         FROM   (VALUES ( 1,'world"hello' ),
                        (2,'hows"bro"life' )) t2 (id, NAME)
                CROSS apply (SELECT *
                             FROM   Delimitedsplit8k(t2.NAME, '"')) cs)
SELECT DISTINCT t1.id,
                t1.NAME,
                t2.id,
                t2.NAME
FROM   tab1 t1
       JOIN tab2 t2
         ON t1.Item = t2.Item 

从这里创建分割字符串

Tally OH! An Improved SQL 8K “CSV Splitter” Function

【讨论】:

    【解决方案2】:

    您可以将column2 转换为xml 并使用xquery 对值进行排序和比较。

    declare @T1 table (id int, col varchar(max))
    insert into @T1 (id, col) values (1, 'hellow"world'), (2, 'a"b"c')
    
    declare @T2 table (id int, col varchar(max))
    insert into @T2 (id, col) values (1, 'world"hellow'), (2, 'b"c"a')
    
    select *
    from @T1 as t1
    inner join @T2 as t2 on t1.id = t2.id
    where 
        cast('<a>' + replace(t1.col, '"', '</a><a>') + '</a>' as xml).query('for $x in /a order by $x return string($x)').value('/', 'varchar(max)') =
        cast('<a>' + replace(t2.col, '"', '</a><a>') + '</a>' as xml).query('for $x in /a order by $x return string($x)').value('/', 'varchar(max)')
    

    【讨论】:

      猜你喜欢
      • 2019-04-05
      • 2012-04-27
      • 2023-03-10
      • 2011-08-22
      • 2012-06-23
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 2018-09-16
      相关资源
      最近更新 更多