2017-05-23 74 views
1

我想加入2個視圖使用列b和d,它們是nvarchar列。使用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.只有具備數字在他們的數字先多0在圖,該做記錄與視圖2中的數字不匹配,因爲它們沒有任何0,但值相同。

我想要一個匹配條件。轉換爲int不可行,因爲我在該字段中也有字母。

+0

您需要提供的是什麼,是不匹配的更多信息。 –

+0

你可能需要一個字符串函數,但我懷疑是否有一個能夠輕鬆處理整個視圖的函數。 –

+0

@GordonLinoff你在找什麼具體信息? – Rahul

回答

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 
+0

這是否將所有記錄轉換爲int值。 – Rahul

+2

注意:[**'try_convert()'**](https://msdn.microsoft.com/en-us/library/hh230993.aspx)是sql server 2012+,並且將爲null返回值爲null的值不要轉換爲指定的類型。 +1 – SqlZim

0

根據你的榜樣,我會用REPLACE()

SELECT * 
FROM View1 V1 
INNER JOIN View2 V2 on REPLACE(V1.B,'0','') = V2.D 
+0

會不會導致'90'到'= 9'? – SqlZim

+0

@SqlZim是的。基於示例* –

+0

*的重壓力在數字之後也爲零。不過謝謝,我沒有詳細說明,這是我的錯。 – Rahul

1

之前到SQL Server 2012+你可以用它來取代任何領先0 S:

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