使用nvarchar列

时间:2017-05-23 18:21:12

标签: sql sql-server

我正在尝试使用列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是不可行的,因为我在该字段中也有字母表。

3 个答案:

答案 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 |
+---+-----+-----+---+

<小时/> 上述内容与00不匹配,一种解决方法会将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