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を使用できます。それ以外の場合は、要件に応じて 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)

ISNUMERIC は Decimal 値でも 1 (true) になるため、理想的には独自のIsInteger UDF を実装する必要があります。これを行うには、この質問を見てください。

T-sql - 値が整数かどうかを判断する

于 2012-08-22T16:52:50.367 に答える
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

私は3番目のものを選びます。理由は以下の通りです。

IN述語のデメリット

2つのリストオブジェクトがあるとします。

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

含むを使用して、リスト2の各リスト1アイテムを検索します。これは、反復が49回発生することを意味します。

于 2012-08-22T16:55:50.547 に答える
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

existscaluse を使用することもできます。

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

使ってみてくださいCAST()

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