Sql 使用nvarchar列连接两个视图的步骤

Sql 使用nvarchar列连接两个视图的步骤,sql,sql-server,Sql,Sql Server,我正在尝试使用列b和d连接两个视图,它们是nvarchar列 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,但值相同 我想要一个连接条件,该条件与

我正在尝试使用列b和d连接两个视图,它们是nvarchar列

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是不可行的,因为我在该领域也有字母表。

这能满足您的需要吗?不确定是否涵盖所有场景。第一个ON将获得INT匹配,第二个ON将获得匹配的所有其他内容

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

这适合你的需要吗?不确定是否涵盖所有场景。第一个ON将获得INT匹配,第二个ON将获得匹配的所有其他内容

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

根据您的示例,我将使用替换:


根据您的示例,我将使用替换:


在SQL Server 2012+之前,您可以使用此选项替换任何前导0:

rextester演示:

返回:

+---+-----+-----+---+
| a |  b  |  d  | e |
+---+-----+-----+---+
| w | 009 | 9   | c |
| q | qw  | qw  | b |
| z | 004 | 4   | v |
| l | T-Q | T-Q | n |
+---+-----+-----+---+
上面的值与0和0不匹配,一种解决方法将空值替换为0。如果列可以有null值,则此解决方案将不适用,因为它将现有null与0相匹配


rextester演示:

在SQL Server 2012+之前,您可以使用它来替换任何领先的0:

rextester演示:

返回:

+---+-----+-----+---+
| a |  b  |  d  | e |
+---+-----+-----+---+
| w | 009 | 9   | c |
| q | qw  | qw  | b |
| z | 004 | 4   | v |
| l | T-Q | T-Q | n |
+---+-----+-----+---+
上面的值与0和0不匹配,一种解决方法将空值替换为0。如果列可以有null值,则此解决方案将不适用,因为它将现有null与0相匹配


rextester演示:

您需要提供更多关于什么是匹配项和什么不是匹配项的信息。您可能需要一个字符串函数,但我怀疑是否有一种方法可以轻松地用于整个视图。@GordonLinoff您要查找的任何特定信息?@AaronDietz String函数将非常危险,因为某些记录将与其他记录合并,而这些记录无法提供正确的输出。您需要提供更多关于什么是匹配的,什么不是匹配的信息。您可能需要一个字符串函数,但我怀疑是否有一个函数可以轻松地用于整个视图。@GordonLinoff您要查找的任何特定信息?@AaronDietz String函数将非常危险,因为某些记录将与其他记录合并,而这些记录无法提供正确的输出。这是否会将所有记录转换为int值。注意:sql server 2012+,对于未转换为指定类型的值,将返回null+1此操作是否将所有记录转换为int值。注意:是sql server 2012+,对于未转换为指定类型的值,将返回null+1这难道不会导致90到=9吗?@SqlZim是的。根据例子,数字后面也有零。不过谢谢,我没有具体说明这一点是我的错。这不也会导致90到=9吗?@SqlZim是的。根据例子,数字后面也有零。不过谢谢,我没有具体说明是我的错。
select v1.*, v2.*
from v1
  inner join v2
    on isnull(stuff(v1.b,1,patindex('%[^0]%',v1.b)-1,''),'0')
      = v2.d