【问题标题】:How to split data in SQL Server table row如何在 SQL Server 表行中拆分数据
【发布时间】:2019-01-03 12:31:11
【问题描述】:

我有一个事务表,其中包含一个列transactionId,其值类似于|H000021|B1|

我需要与表 Category 进行连接,该表有一个 CategoryID 列,其值类似于 H000021

除非数据相同,否则我无法应用联接。

所以我想拆分或删除TransctionId 中包含的不必要数据,以便我可以加入两个表。

请帮助我解决问题。

【问题讨论】:

  • |H000021|B1| 的实际值是多少是否 |也是该数字的一部分。
  • 即使您使用STRING_SPLIT 或其他技术来提取值,性能也会受到影响,因为无法使用transactionID 上的索引。您应该修复错误的设计或添加一个计算列来提取 categoryID 并用索引覆盖它

标签: sql .net sql-server tsql


【解决方案1】:

仅使用代码创建计算列。

初始场景:

create table Transactions
(
 transactionId varchar(12) primary key,
 whatever varchar(100)
)

create table Category
(
  transactionId varchar(7) primary key,
  name varchar(100)
)

insert into Transactions 
select'|H000021|B1|', 'Anything'

insert into Category 
select 'H000021', 'A category'

添加计算列:

alter table Transactions add transactionId_code as substring(transactionid, 2, 7) persisted

使用新的计算列加入:

select *
from Transactions t
inner join Category c on t.transactionId_code = c.transactionId

获得一个简单的查询计划:

【讨论】:

    【解决方案2】:

    您应该修正您的数据,以便列是相同的。但有时我们会被其他人的错误设计决定所困扰。特别是,交易数据应该包含一个类别列——即使类别是 id 的一部分。

    无论如何:

    select . . .
    from transaction t join
         category c
         on transactionid like '|' + categoryid + |%';
    

    或者如果类别 ID 始终为 7 个字符:

    select . . .
    from transaction t join
         category c
         on categoryid = substring(transactionid, 2, 7)
    

    【讨论】:

      【解决方案3】:

      您可以使用查询来做到这一点:

      CREATE TABLE #MyTable  
      (PrimaryKey   int PRIMARY KEY,  
         KeyTransacFull      varchar(50) 
        );  
      GO  
      
      CREATE TABLE #MyTransaction 
      (PrimaryKey   int PRIMARY KEY,  
         KeyTransac      varchar(50) 
        );  
      GO  
      
      INSERT INTO #MyTable 
      SELECT 1, '|H000021|B1|'
      
      INSERT INTO #MyTable 
      SELECT 2, '|H000021|B1|'
      
      
      INSERT INTO #MyTransaction 
      SELECT 1, 'H000021'
      
      
      SELECT * FROM #MyTable
      
      SELECT * FROM #MyTransaction
      
      SELECT * 
      FROM #MyTable 
      JOIN #MyTransaction ON KeyTransacFull LIKE '|'+KeyTransac+'|%' 
      
      DROP TABLE  #MyTable
      
      DROP TABLE  #MyTransaction
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多