删除连接中的前导零

时间:2015-06-24 11:35:13

标签: sql sql-server casting

表格是:

Table A: tag_num (nvarchar(6))       Table B: tag_num (nvarchar(6))
------------------------------       ------------------------------
883                                  00883

查询:

select * from A test1 
inner join B test2 on test2.tag_num = test1.tag_num

由于表B中的前导零而返回0行。

如何返回结果

A.tag_num | B.tag_num
883       | 00883

即使表B列包含前导零。

我应该使用哪种数据类型?

5 个答案:

答案 0 :(得分:9)

您可以将列投射到int

select * 
from A test1 
inner join B test2 
      on cast(test2.tag_num as int) = cast(test1.tag_num as int)

或者首先在表格中更好地使用int作为数据类型。

答案 1 :(得分:4)

你应该cast将字符串设置为int并加入它们

SELECT *
    FROM A AS test1 INNER JOIN B AS test2 
    ON CAST(test2.tag_num AS INT) = CAST(test1.tag_num AS INT)

答案 2 :(得分:2)

您可以保留NVARCHAR的数据类型并使用SUBSTRING删除以下前导零:

select * from A test1 
inner join B test2 on test1.tag_num =
SUBSTRING(test2.tag_num, PATINDEX('%[^0]%', test2.tag_num+'.'), LEN(test2.tag_num))

答案 3 :(得分:1)

如果您希望使用索引,则希望避免双方都进行类型转换。一种方法是使用like

select *
from A inner join
     B
     on b.tag_num like '%' + a.tag_num;

然而,这太笼统了,因为通配符会匹配太多东西。另一种方法是使用in

select *
from A inner join
     B
     on b.tag_num in (a.tag_num, '0' + a.tag_num, '00' + a.tag_num)

这有希望在b.tag_num. Getting a sargable expression for a.tag_num`上使用索引更具挑战性。

答案 4 :(得分:0)

只是缩短版本的演员:

select * from A test1 
inner join B test2 on 1*test2.tag_num = test1.tag_num

乘以1会自动将结果投射到int