表格是:
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
列包含前导零。
我应该使用哪种数据类型?
答案 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
。