为什么SQL Join发现两个不同长度的字符串相等?

为什么SQL Join发现两个不同长度的字符串相等?,sql,join,equals,foxpro,Sql,Join,Equals,Foxpro,我创建了一个使用左连接的查询。出于我不理解的原因,它将连接两个不同长度的字符串,就好像它们相等一样。例如: Left column = "351-561" Right Column = "351-561-35C" Result = Joined as equal. 我的解决方法是将字符串右键填充到相同的长度。我不明白为什么这两个字符串会被视为相等的 语法中是否有某种机制可以改变这种行为 D.在Visual FoxPro中,中,=运算符表示相等,您可能需要使用=运算符。==运算符表示“完全相等”

我创建了一个使用左连接的查询。出于我不理解的原因,它将连接两个不同长度的字符串,就好像它们相等一样。例如:

Left column = "351-561"
Right Column = "351-561-35C"
Result = Joined as equal.
我的解决方法是将字符串右键填充到相同的长度。我不明白为什么这两个字符串会被视为相等的

语法中是否有某种机制可以改变这种行为


D.

在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" *返回。因为左边的前3个字符与右边匹配。 ? "123" = "12345" *返回。因为表达式大小不相等。 ? "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 创建光标“MyLeft”(LeftPK I,LeftCode C(20)) 在“MyLeft”值中插入(1,“351-561”) 在“MyLeft”值中插入(2,“555-1234”) 创建光标“MyRight”(RightPK I,RightCode C(20)) 插入“MyRight”值(1,“351-561-35C”) 插入“MyRight”值(2,“555-1234”) 从“MyLeft”中选择MyLeft.*,MyRight.*并在LeftCode=RightCode上加入“MyRight”

而此查询返回两条记录,因为列类型为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 创建光标“MyLeft”(LeftPK I,LeftCode V(20)) 在“MyLeft”值中插入(1,“351-561”) 在“MyLeft”值中插入(2,“555-1234”) 创建光标“MyRight”(RightPK I,RightCode V(20)) 插入“MyRight”值(1,“351-561-35C”) 插入“MyRight”值(2,“555-1234”) 从“MyLeft”中选择MyLeft.*,MyRight.*并在LeftCode=RightCode上加入“MyRight”

什么数据库产品和版本?它们是什么数据类型?你能编辑你的帖子以包含sql吗?它们根本不相等。您能显示您的数据和查询吗?我能想到的唯一原因是,如果正确的列被隐式转换为
char(7)
,则不确定是否有任何产品会这样做。join中的一个表是长度设置为7的临时表,导致值被截断吗?WTF!这就是问题所在。谢谢你,马丁。我确实不明白为什么单个=会以这种方式改变行为。我认为,如果将它解释为赋值运算符,我将得到比长度不同的字符串更多的匹配。嗯。不管怎样,谢谢你帮我澄清。D.@Donovan-WTF的确如此。我不认为它将其视为赋值,我认为默认行为很奇怪<代码>将ANSI设置为ON(打开)也可以从以下方面入手:这对于解释CHAR vs VARCHAR行为非常有帮助。我的原始联接在两个比较值上都使用了alltrim()。现在这似乎有点放错地方了。看起来==本身就可以完成这项工作。