SQL Server:加入忽略前导零

时间:2015-02-19 21:56:13

标签: sql-server join

我的问题非常简单,所以我会在不制作任何虚拟表格的情况下尝试询问。

考虑我有两个表的情况:A和B.

假设A有varcharAVarAVar中的每个元素都是一个不以0开头的整数字符串。

另外假设B有varcharBVarBVar的元素与AVar中的条目相同,但有1或2个0 {1}}在每个条目前面。

例如" 123454"在AVar会有一个相应的" 0123454"或" 00123454"在BVar

当我执行以下查询时,我发现我的连接成功运行,即使两个表中的varchar元素在技术上不是相同的字符串值。

引擎盖下发生了什么让这种比较放松了?

SELECT 
    A.AVar, B.BVar
FROM 
    A 
LEFT JOIN 
    B ON A.AVar = B.BVar

2 个答案:

答案 0 :(得分:2)

Sql Server执行隐式转换

select * from (
select 1  a , '00001' b union all
select 1  a , '1' b ) x
where x.b = x.a 

产生

a   b
1   00001
1   1

虽然这个

select * from (
select 1  a , '00001' b union all
select 1  a , '1' b ) x
where x.b like x.a 

产生

a   b
1   1

答案 1 :(得分:0)

您只需使用CONVERT()CAST()方法即可。见下文:

使用CONVERT()

SELECT
     CONVERT(NUMERIC,A.AVar)A.AVar, 
     CONVERT(NUMERIC,B.BVar)B.AVar
FROM A LEFT JOIN B
ON A.AVar = B.BVar

使用CAST()

SELECT
    CAST(A.AVar AS NUMERIC)A.AVar, 
    CAST(B.BVar AS NUMERIC)B.AVar
FROM A LEFT JOIN B
ON A.AVar = B.BVar