基于与另一个字段匹配的varchar字段的一部分进行连接

时间:2015-12-14 01:50:41

标签: sql-server-2008 join conditional

我正在寻找加入两个表的左连接。一个表上的字符串描述包含另一个表的UID。我只想在描述与UID匹配时才进行左连接。我需要返回Transactions表中的所有记录。 是否可以使用IF或条件语句来连接表,否则将字段保留为空?

这是一个小提琴: http://sqlfiddle.com/#!3/aaa38/5

交易表:

posted_date  person_id  description 
2015-11-01    2         BZ#1414 Description 1414
2015-11-01    2         Another type of transaction with spaces in it
2015-11-01    3         BZ#1313 Another description 1313
2015-11-01    3         Another_description_without_spaces

Transaction_details表:

id    person_id   description
1414    2         additional stuff for 1414
1313    3         additional stuff for 1313

结果应该如下:

posted_date person_id   description     id   person_id  description
2015-11-01   2          BZ#1414 Des...  1414    2       additional...
2015-11-01   2          Another typ...  NULL    NULL    NULL
2015-11-01   3          BZ#1313 Ano...  1313    3       additional...
2015-11-01   3          Another_des...  NULL    NULL    NULL

2 个答案:

答案 0 :(得分:0)

像这样加入真的意味着你的Transactions表结构不好(你可以使用一个单独的列来加入Transaction_details)。

话虽如此,你仍然可以实现你想要的。您可以在描述以BZ#开头时加入,然后加入以下内容,使用id的长度来提取数字。这比尝试在描述中找到空格更好,因为可能没有任何空格。

如果没有匹配,左连接将执行其余操作并使用空值填充tran_details中的字段。

select * 
from
transactions t
left join tran_details d
on t.person_id = d.person_id
and left(t.description, 3) = 'BZ#'
and substring(t.description, 4, len(cast(d.id as nvarchar(50)))) = d.id

如果BZ#后跟详细信息表中的ID,我假设您要加入。

SQL Fiddle

答案 1 :(得分:0)

以下查询将有效,只要前3个字符是' BZ#'在Transaction.Description列中

select * from Transactions t left outer join Transaction_details td on t.person_id = td.person_id and left(t.description,3)=' BZ#'和  REPLACE(SUBSTRING(t.description,0,CHARINDEX('',t.description,0)),' BZ#','')= td.id