我想使用该IN
子句,但要使用该convert
功能。基本上,我有一个表 ( A
) 类型的列int
。但在另一个表 ( B
) 中,我有类型的值varchar
。本质上,我正在寻找这样的东西
select *
from B
where myB_Column IN (select myA_Columng from A)
但是,我不确定int
from table是否会为inA
正确映射/转换/评估。varchar
B
我正在使用 SQL Server 2008。
我想使用该IN
子句,但要使用该convert
功能。基本上,我有一个表 ( A
) 类型的列int
。但在另一个表 ( B
) 中,我有类型的值varchar
。本质上,我正在寻找这样的东西
select *
from B
where myB_Column IN (select myA_Columng from A)
但是,我不确定int
from table是否会为inA
正确映射/转换/评估。varchar
B
我正在使用 SQL Server 2008。
您可以在这样的 where 子句中使用 CASE 语句,并且只有在其整数时才可以使用 CAST。else 0 或 NULL 取决于您的要求。
SELECT *
FROM B
WHERE CASE ISNUMERIC(myB_Column) WHEN 1 THEN CAST(myB_Column AS INT) ELSE 0 END
IN (SELECT myA_Columng FROM A)
对于 Decimal 值,ISNUMERIC 将为 1(真),因此理想情况下,您应该实现自己的IsInteger UDF。要做到这一点,请查看这个问题
你也可以使用exists
caluse,
select *
from B
where EXISTS (select 1 from A WHERE CAST(myA_Column AS VARCHAR) = myB_Column)
您可以使用以下查询:
select B.*
from B
inner join (Select distinct MyA_Columng from A) AS X ON B.MyB_Column = CAST(x.MyA_Columng as NVARCHAR(50))
Select * from B where myB_Column IN
(
Select Cast(myA_Columng As Int) from A Where ISNUMERIC(myA_Columng) = 1
)
Select B.* from B
Inner Join
(
Select Cast(myA_Columng As Int) As myA_Columng from A
Where ISNUMERIC(myA_Columng) = 1
) T
On T.myA_Columng = B.myB_Column
Select B.* from B
Left Join
(
Select Cast(myA_Columng As Int) As myA_Columng from A
Where ISNUMERIC(myA_Columng) = 1
) T
On T.myA_Columng = B.myB_Column
我会选择第三个。原因如下。
假设我有两个列表对象。
List 1 List 2
1 12
2 7
3 8
4 98
5 9
6 10
7 6
使用 Contains,它将搜索 List-2 中的每个 List-1 项目,这意味着迭代将发生 49 次!!!
尝试使用CAST()
SELECT *
FROM B
WHERE CAST(myB_Column AS INT(11)) IN (
SELECT myA_Columng
FROM A
)