2016-12-12 3 views
0

テーブルが2つあります(私のものではありません)。問題は左テーブルの列が時には数字であり、時には文字列であることです。右側の表の列は常に数値です。左の列を変換できない場合はSQLエラーが発生します。sqlは、左の列に数値を指定できる場合にのみ結合します。

できるだけいつでも列に参加できますか?

+0

1)数値を文字列にキャストして比較します。 2)サブクエリを作成して数値である値を返し、それ以外の値では結合を行います。 – xQbert

答えて

1

変更エンジンは暗黙的に聞かせてはいけない代わりに、int型の文字列(Aのデータ型)(Bのデータ型)

SELECT a.*, B.* 
FROM A 
LEFT JOIN B 
-- on B.AID=A.ID --Instead of B.AID= A.ID 
    on A.ID = B.AID 

にキャストしようとするので、値が最初にリストされているように、句上の順序エンジンは暗黙のキャストを行い、強制的に文字列にB値...文字列へ

鋳造番号...

SELECT a.*, B.* 
FROM A 
LEFT JOIN B 
on trim(A.ID) = cast(B.AID as varchar(100)) 

または

012をキャスト

は、Aが数値であり、残りのAの中の共用体でない場合にのみ結合します。注:以下の結合の代わりにBからの値を綴る必要があるかもしれません。

SELECT a.*, B.* 
FROM (SELECT * from A where isNumeric(ID)) A 
LEFT JOIN B 
on A.ID = cast(B.AID as varchar(100)) 
UNION 
SELECT A.*, B.* 
FROM A 
LEFT JOIN (SELECT * From B where 1 =0) 
WHERE not isNumeric(ID) 
+0

私は結合で重要な順序を認識していなかったし、on節でキャストすることもできなかった。非常に有益な、ありがとう。 –

+0

私が知る限り、エンジンは常に、データ型が異なるときに最初に遭遇したデータ型(式の左側にあるもの)にキャストしようとします。 – xQbert

関連する問題