• ベストアンサー

結合で、条件左右で型が違った時エラーにならない方法

いつも大変お世話になっております。 よく分かっていなくて申し訳ありません。 SELECT … FROM A Right Outer Join B B on B.c =A.d  というようなSQL文で B.cはvarcharでA.dはintです。 B.cは大多数の場合は数値なので動くのですが、稀に文字列が入ったときにエラーになってしまいます。 ここでエラーにならずに、そこで呼ぼうとしたものがなければNullになるようなよい方法がありましたら、ご教示いただけますと幸いです。 以下の添付画像のような結果を得られると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

SELECT … FROM A Right Outer Join B B on B.c =Convert(varchar(10),A.d) varchar(10),は、 B.cの型にあわせる。 ただし、 今までは暗黙の型変換で、数値に変換されていたから条件が成立していたケースで条件が成立しない 場合がでてくるかもしれません。 例) B.cが' 1'で、A.dが1のとき、 数値に変換されると、どちらも1ですが、 文字に変換すると、 B.cが' 1'で、A.dが'1 'になって等しくならないかも。 というようなことがおきたら、 on trim(B.c) = trim(Convert(varchar(10),A.d)) trim()を利用してください。

Galax01
質問者

お礼

できました。 良い手段をありがとうございます。 助かりました。

関連するQ&A

  • 3テーブル外部結合方法について

    3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・

  • JOINのネスト制限?

    基本的な問題かもしれませんが、SQLのJOINの使い方が判らないので教えて下さい。 SQLで A表とB表とC表をINNER JOINした表に対して、 D表をOUTER JOINした結果に対して、E表をINNER JOINしたいのですが、 SQL文で書くことは可能でしょうか? SELECT ((((cols FROM A INNER JOIN B ON --) INNER JOIN C ON --) OUTER JOIN D ON --) INNER JOIN E ON --) と単純に書くとネスト数のオーバーなのかエラーが出ます。 後ろの部分だとサブクエリーに対してJOINすればよいかもしれませんが、主ファイルに当る部分の場合はサブクエリーに切り出す方法が判りません。 よろしくお願いします。

  • テーブル結合で、結合フィールドをWHERE句に用いた時に、結合フィールドのデータがNULLになってしまう。

    MySQL 4.0.24-standard + PHP Version 4.3.11 を使用しています。 下記のような table_a, table_b があり、idフィールドで外部結合させています。 table_a id|value ------- 1 | 0 2 | 1 table_b id|name ------- 1 | A 2 | B SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b; result id|value|name -------------- 1 | 0 | A 2 | 1 | B しかし、下記のクエリでは、このようにidがNULLになってしまいます。 SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b WHERE table_a.id = 1; result id |value|name -------------- NULL| 0 | A 以下のような結果を得たいのですが、どうすれば良いのでしょうか? result id|value|name -------------- 1 | 0 | A

    • ベストアンサー
    • MySQL
  • テーブル結合時のあいまい検索について

    はじめまして。Oracle9iでテーブル結合時のあいまい検索を行いたいのですが、エラーが起こってしまいます。 形としては、 SELECT TABLE1.A, TABLE1.B, TABLE1.C, TABLE2.D, TABLE2.E, TABLE2.F FROM TABLE1, TABLE2, WHERE TABLE1.A = TABLE2.D(+) というような形です。ここで、TABLE1のBとCに「%あ%」というあいまい検索をしたいのですが、上記の文に続いて、 AND TABLE1.B LIKE '%あ%' OR TABLE1.C LIKE '%あ%' と続けて実行すると、 ORA-01719: outer join operator (+) not allowed in operand of OR or IN というエラーになってしまいます。 こういった場合はどう対処すればよろしいのでしょうか?SQLについてほとんどわかりませんが、よろしくお願いします。

  • 意味は同じはずなのに結果が違います。

    SELECT * FROM テーブルA LEFT OUTER JOIN ( SELECT * FROM テーブルB WHERE テーブルB.列X IS NOT NULL) as テーブルB ON テーブルA.列A = テーブルB.列A SELECT * FROM テーブルA LEFT OUTER JOIN テーブルB ON テーブルA.列A = テーブルB.列A WHERE テーブルB.列X IS NOT NULL 上のSQLも下の同じ事をしてると思うのですが 上では検索結果が10件出た場合 下では0件になってしまいます。 SQL自体シンプルで間違っていないと思うのですがなぜでしょうか?

  • sqlについて

    下に書いたsqlのコードの内容(どういう処理でどういう結果になるのか)が知りたいです。 どなたかわかる方教えてください。 select b.ym, b.no,     isnull(e.sumcnt,0)as val, null as bunsi, null as bunbo from (select distinct ym,no from Table_A)b inner join (select ym from Table_B where cd=1)d on b.ym=d.ym left outer join (select b1.ym,b1.no,sum(c1.cnt)as sumcnt from Table_A b1 inner join (select ym from Table_B where cd=1)d1 on b1.ym=d1.ym inner join Table_C c1 on b1.ym=c1.ym group by b1.ym,b1no)e on b.ym=e.ym and b.no=e.no

  • 複数テーブルを結合するには?

    OS:WINDOWSXP SP2 ORACLE:Oracle9i Enterprise Edition Release 9.2.0.1.0 A, B, Cというテーブルがあるとします。 それぞれのテーブルには XXカラムと YYカラムがあるとします。 2つのテーブルを結合させるには、以下のSQL文を記述すれば良いと考えています。 SELECT A.*,B.* FROM A JOIN B ON A.XX = B.XX 3つのテーブルを結合するには、以下のSQL文を記述しています。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX JOIN C ON A.XX = C.XX 但し、この記述方法でいきますと、Cテーブルを右側外部結合に指定した場合のみ、 ORA-00904 "C" 無効な識別子です。 というエラーメッセージが表示されます。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX RIGHT OUTER JOIN C (←LEFT OUTER、FULL OUTER)なら通ります) ON A.XX = C.XX 何故、右側外部結合のみ不正となるのか不明であり、解決策が見つかりません。 複数のテーブルを結合する為のSQL文の記述方法を教えて頂けますでしょうか?

  • joinの入れ子について

    A(contenthead)をベースにAがBに存在せずかつCに存在しないデータをを作りたいのですが上手く行きません。以下を実行すると SELECT a.contentid, b.contentid, d.contentid From (contenthead as a LEFT JOIN group as b on a.contentid = b.contentid) left join (contenthead as c LEFT JOIN ouser as d on c.contentid = d.contentid) on a.contentid = c.contentid 表示結果は 1、1、NULL 2、NULL、Null 3、NULL、3 4、NUL、4 と出て来ます。従って両方にないのは2だけということになります。 実際のデータもそうなっています。 そこで、 WHERE ((b. contentid) is null) and ((d. contentid) is null)を上記SQLに付加するとなぜか 2、NULL、Null 3、NULL、null 4、NUL、NULL と表示されます。 教えて頂きたいことお分かり戴けますでしょうか宜しく御願い致します。

    • ベストアンサー
    • MySQL
  • SQLの使用方法について(動的な結合条件の変更方法について)

    SQL Server2005を使用しています。 以下のような動作を実現したいのですが、どのようなSQLとなるのでしょうか? 以下のような構成のテーブルがあるとします。 テーブルA 分類1(PK) 分類2(PK) 名前 1     空文字   山田 1     1     山田太郎 1     2     山田花子 2     空文字   鈴木 テーブルB 番号(PK) 分類1 分類2 100  1   空文字 101  1   1 外部から受け取るパラメータはテーブルBの番号です。 次の番号を受け取った際に、以下の結果を取得したいのですが、 どのようなSQLとなるのでしょうか? 番号100 ↓ 山田 山田太郎 山田花子 番号101 ↓ 山田太郎 以下の様なSQLを作成して試してみたのですが、番号2をJOINの条件として指定しているため、 番号100の時に望む結果を得ることが出来ませんでした。 SELECT   * FROM   テーブルA AS A LEFT JOIN (   SELECT     *   FROM     テーブルB   WHERE     番号 = パラメータ ) AS B ON  A.分類1 = B.分類1 AND A.分類2 = B.分類2 サブクエリのB.分類2が空文字の場合は、JOINの条件から省くようなことは可能なのでしょうか?

  • OUTER JOIN、WHEREとCOUNTの併用

    SQL文で Aテーブル 1 a 2 b Bテーブル 1 a null 2 a aa 3 b null 4 b bb があり、 AとBをJOINして取得したいのですが、 最終的にAテーブル一覧と、Bテーブルのaaがある項目だけをSelectしてきたいと思っております。 Select結果: 1 a 1(←aaのcountのみ) 2 b 0(←bbやnullなら0) しかし、普通にOUTER JOINして、Whereすると、 bの項目が取得できなかったり、します。 上記のようなデータを取得することは可能でしょうか?