我正在尝试使用列b和d(nvarchar列)连接2个视图。
View 1 View 2
A | B D | E
w 0090 90 c
q qw qw b
z 004 4 v
l T-Q T-Q n
现在,加入了B列和D列。这里因为它们是nvarchar列009与9不匹配。只有包含数字的记录在视图1中的数字前面有多个0,这与列表中的数字不匹配视图2中的数字,因为它们没有任何0,但值是相同的。
我想要一个匹配的连接条件。转换为int是不可行的,因为我在该字段中也有字母表。
答案 0 :(得分:3)
这会满足您的需求吗?不确定它是否涵盖所有情况。第一个ON
将获得INT
个匹配,第二个将获得匹配的所有其他内容。
DECLARE @View1 TABLE (A NVARCHAR(10), B NVARCHAR(10))
DECLARE @View2 TABLE (D NVARCHAR(10), E NVARCHAR(10))
INSERT INTO @View1 VALUES ('w','009'),('q','qw')
INSERT INTO @View2 VALUES ('9','c'),('qw','b')
SELECT *
FROM @View1 a
JOIN @View2 b
ON TRY_CONVERT(INT,a.B) = TRY_CONVERT(INT,b.D)
OR a.B = b.D
答案 1 :(得分:1)
在SQL Server 2012+之前,您可以使用它来替换任何前导0
:
select v1.*, v2.*
from v1
inner join v2
on stuff(v1.b,1,patindex('%[^0]%',v1.b)-1,'')
= v2.d
rextester演示:http://rextester.com/CEFA74351
返回:
+---+-----+-----+---+
| a | b | d | e |
+---+-----+-----+---+
| w | 009 | 9 | c |
| q | qw | qw | b |
| z | 004 | 4 | v |
| l | T-Q | T-Q | n |
+---+-----+-----+---+
<小时/> 上述内容与
0
和0
不匹配,一种解决方法会将null
值替换为0
。如果该列可以包含null
值,则此解决方法将不合适,因为它会将现有空值与0
匹配。
select v1.*, v2.*
from v1
inner join v2
on isnull(stuff(v1.b,1,patindex('%[^0]%',v1.b)-1,''),'0')
= v2.d
rextester演示:http://rextester.com/OTCI42982
答案 2 :(得分:0)
根据您的示例,我会使用REPLACE()
:
SELECT *
FROM View1 V1
INNER JOIN View2 V2 on REPLACE(V1.B,'0','') = V2.D