如何在SQL Server表行中拆分数据

时间:2019-01-03 12:31:11

标签: sql .net sql-server tsql

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

我需要与表Category进行联接,该表的列CategoryID的值类似于H000021

除非数据相同,否则我无法申请加入。

因此,我想拆分或删除TransctionId中包含的不必要数据,以便我可以联接两个表。

请帮助我解决问题。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

您可以使用查询:

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

答案 2 :(得分: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

获取直观的查询计划:

enter image description here