0

我想使用该IN子句,但要使用该convert功能。基本上,我有一个表 ( A) 类型的列int。但在另一个表 ( B) 中,我有类型的值varchar。本质上,我正在寻找这样的东西

select *
from B
where myB_Column IN (select myA_Columng from A)

但是,我不确定intfrom table是否会为inA正确映射/转换/评估。varcharB

我正在使用 SQL Server 2008。

4

5 回答 5

2

您可以在这样的 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。要做到这一点,请查看这个问题

T-sql - 确定值是否为整数

于 2012-08-22T16:52:50.367 回答
0

你也可以使用existscaluse,

select *
from B
where EXISTS (select 1 from A WHERE CAST(myA_Column AS VARCHAR) = myB_Column)
于 2012-08-22T17:32:23.603 回答
0

您可以使用以下查询:

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))
于 2012-08-23T05:19:03.400 回答
0

选项1

Select * from B where myB_Column IN 
(
      Select Cast(myA_Columng As Int) from A Where ISNUMERIC(myA_Columng) = 1
)

选项 #2

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

选项#3

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

我会选择第三个。原因如下。

IN谓词的缺点

假设我有两个列表对象。

List 1      List 2
  1           12
  2            7
  3            8
  4           98
  5            9
  6           10
  7            6

使用 Contains,它将搜索 List-2 中的每个 List-1 项目,这意味着迭代将发生 49 次!!!

于 2012-08-22T16:55:50.547 回答
-1

尝试使用CAST()

SELECT * 
FROM   B 
WHERE  CAST(myB_Column AS INT(11)) IN (
                                       SELECT myA_Columng
                                       FROM A
                                      )
于 2012-08-22T15:37:52.180 回答