2016-05-06 94 views
1

我有这个疑问删除选项卡位2012

INNER JOIN view AS vw ON vw.[Id] = vw2.[Id] 

的问题是在VW2的回报。[ID]末(“2012‘)包含一个标签空间和大众没有(’ 2012' )。所以我试着做

INNER JOIN view AS vw ON vw.[Id] = Replace(vw2.[Id], char(9), '') 

不幸的是,比较仍然返回false。我认为它不能在连接上完成,所以我尝试了一个选择查询

SELECT * 
FROM database.view2 
WHERE REPLACE(Id, char(9), '') = '2012 ' 

但是,此查询也返回false。有人能向我解释我错过了什么概念或误解?

编辑

您好,感谢大家谁把自己的时间来帮助我在此。看来

vw.[Id] = LTRIM(RTRIM(REPLACE(vw2.[Id], char(9), '') 

做到了这一招。在两端都使用REPLACE,这是由于非常长的查询时间而导致的,这是不必要的。我用LTRIMRTRIM也得到的数据,但从varbinary回报它不应该需要,我不明白我做错了什么。但它现在很有用,谢谢大家。

+0

这两个Id存储为什么数据类型? – Sturgus

+0

Hi @Sturgus都在nvarchar –

+0

对于你认为以单个标签结束的值,'select vw2。[Id],cast(vw2。[Id] as varbinary(max))'的结果是什么? –

回答

2

我怀疑有可能是你所面对的不仅仅是一个标签多个字符。例如,您包含 REPLACE(Id, char(9), '') = '2012 ' 替换后为什么末尾仍有空格?

我能得到你的方法在SQL 2008 R2的工作,所以下面是证明了概念代码。

CREATE TABLE #table1 (
Id varchar(5) 
) 

CREATE TABLE #table2 (
Id varchar(5) 
) 

INSERT INTO #table1 
VALUES 
('2012') 
,('2013') 
,('2014') 
,('2015') 
,('2016') 

INSERT INTO #table2 
VALUES 
('2012'+CHAR(9)) 
,('2013'+CHAR(9)) 
,('2014'+CHAR(9)) 
,('2015'+CHAR(9)) 
,('2016'+CHAR(9)) 

SELECT t1.Id, t2.Id 
FROM #table1 t1 
INNER JOIN #table2 t2 
    ON t1.Id = REPLACE(t2.Id,CHAR(9),'') 

看看是否给你正确的结果 - 它对我来说。

+0

嗨,谢谢你,但你有没有尝试在字符串中插入“tab”而不是+ CHAR(9)?如果这样也可以,也许是因为我使用nvarchar? –

+0

Less-比彻底测试char和nchar变体,以及实际上使用tab内的字符串,也显示正确的结果 – Forrest

+0

感谢您花费你的时间,我真的很感激它,然后如果是这种情况,这是令人沮丧的。 ?大声笑 –

1

你的逻辑看起来不错。您是否尝试过:

INNER JOIN view AS vw ON vw.[Id] = RTRIM(vw2.[Id]) 

您还可以结合修剪和替换,以此来摆脱所有空白的。不过,这似乎是用大锤来获得你想要的...

INNER JOIN view AS vw ON REPLACE(LTRIM(RTRIM(vw.[Id]), char(9), '') = REPLACE(LTRIM(RTRIM(vw2.[Id]), char(9), '') 
+0

已经尝试过这一个,虽然没有工作。我知道这应该是简单的,但我不知道为什么它不工作:\ –

+0

嗯......如果上述编辑不起作用,我想你将不得不检查你的值在两个IDA更密切一点。它应该完成这项工作。 – Sturgus

+0

我试着在VARBINARY(最大)铸造它来显示两者的差异,这是结果 0x4F00500045002D003000300030003500340039003300320036003800 0x4F00500045002D0030003000300035003400390033003200360038000900 看来这个标签是唯一的区别,但我不知道为什么它不工作 –

1

试试这个:

INNER JOIN视图大众ON LTRIM(RTRIM(VW [ID]))= LTRIM( RTRIM(VW2。[ID]))

+0

是的,已经尝试过,但它不工作 –

+0

INNER JOIN查看AS vw ON ltrim(rtrim(replace(vw。[Id],char(9),'') ))= ltrim(rtrim(替换(vw2。[Id],char(9),'')) – Safford96

+0

我不认为这是好的做法,因为查询已经运行了5分钟,并且仍然没有结果,其中原始只需要大约10秒 –

1

这不回答原来的问题,但它可以作为一个变通的功能:

INNER JOIN view AS vw ON CONVERT(integer, vw.[Id]) = CONVERT(integer, vw2.[Id]) 

如果所有的标识都类似于整数(如你的“2012”的例子是)。

+0

嗨@Sturgus我只用2012作为例子,但Id是String-Int的组合,这就是为什么我使用nvarchar。很抱歉对于这个误会。 –

+0

织补。回到绘图板。 – Sturgus