2011-02-25 21 views
2

我创建了一个使用左连接的查询。由于我不明白的原因,它会加入两个不同长度的字符串,就好像它们是相等的。一个例子是:为什么SQL Join会发现两个不相等的长度字符串相等?

Left column = "351-561" 
Right Column = "351-561-35C" 
Result = Joined as equal. 

我的解决方法是将字符串填充到相同的长度。我不明白为什么这两个字符串会被视为平等。

在语法中是否有一些机制会改变这种行为?

D.

+1

什么数据库产品和版本? – Thomas 2011-02-25 20:03:30

+0

它们是什么数据类型?你可以编辑你的文章,包括SQL? – adam0101 2011-02-25 20:03:41

+0

他们根本不相等。你能否显示你的数据和你的查询? – Andrey 2011-02-25 20:03:41

回答

3

看起来你可能需要使用==运营商Visual Fox Pro

+0

WTF!这是问题所在。感谢Martin。我当然不明白为什么一个人会以这种方式改变行为。我会认为,如果它被解释为一个赋值运算符,我会得到更多的匹配,而不仅仅是不同长度的字符串。 Hmmph。无论如何,谢谢你让我挺身而出。 D. – Donovan 2011-02-25 20:22:12

+0

@Donovan - 确实是WTF。我不认为它把它当作任务,我认为默认行为很奇怪。 'SET ANSI ON'也可以通过查看[本知识库文章](http://msdn.microsoft.com/en-us/library/hx5eyfsx%28v=vs.71%29)来工作。aspx) – 2011-02-25 20:24:57

1

在Visual FoxPro,=操作手段等。 ==运算符表示“完全相等”。换句话说,==运算符比较每个表达式的大小和值。例如:

 
* Returns .T. because the first 3 characters on the left match the right. 
? "123" = "12345" 

* Returns .F. because the expression sizes are not equal. 
? "123" == "12345" 


话虽这么说,我能想到的一个连接还是会失败的唯一原因是因为你是加盟的列是不一样的尺寸。例如,此查询仅返回555-1234记录,因为CHAR列自动填充空格。

 
CREATE CURSOR "MyLeft" (LeftPK I, LeftCode C(20)) 
INSERT INTO "MyLeft" VALUES(1, "351-561") 
INSERT INTO "MyLeft" VALUES(2, "555-1234") 

CREATE CURSOR "MyRight" (RightPK I, RightCode C(20)) 
INSERT INTO "MyRight" VALUES(1, "351-561-35C") 
INSERT INTO "MyRight" VALUES(2, "555-1234") 

SELECT MyLeft.*, MyRight.* FROM "MyLeft" JOIN "MyRight" ON LeftCode = RightCode 


然而,因为列类型为VARCHAR此查询返回两个记录。

 
CREATE CURSOR "MyLeft" (LeftPK I, LeftCode V(20)) 
INSERT INTO "MyLeft" VALUES(1, "351-561") 
INSERT INTO "MyLeft" VALUES(2, "555-1234") 

CREATE CURSOR "MyRight" (RightPK I, RightCode V(20)) 
INSERT INTO "MyRight" VALUES(1, "351-561-35C") 
INSERT INTO "MyRight" VALUES(2, "555-1234") 

SELECT MyLeft.*, MyRight.* FROM "MyLeft" JOIN "MyRight" ON LeftCode = RightCode 


+0

这对解释CHAR和VARCHAR行为非常有帮助。我原来的JOIN在两个比较值上都使用了alltrim()。这似乎有点错位了。它看起来像==本身会完成这项工作。 – Donovan 2011-03-01 06:43:38

相关问题