質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

161閲覧

SQLで、ORDER BY区にてORA-01722が発生している

yamapi1012bs

総合スコア11

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2024/11/13 05:15

編集2024/11/13 05:30

実現したいこと

table2またはtable3に存在するデータを出力したいです。
具体的には、下記の条件で出力します。
table2、table3ともに存在する場合:table2のデータ
table2にのみ存在する場合:table2のデータ
table3にのみ存在する場合:table3のデータ

table1のnoはvarchar2型です。
また、table1のnameはnvarchar2型、table2,3のnoはvarchar2型です。
noは、主キーで、前ゼロ8桁の半角数値が入ります。

発生している問題・分からないこと

SQLを作成したのですが、ORDER BY句でORA-01722が発生しているようです。
(ORDER BYの行を消したら実行できる)

原因を教えていただけますでしょうか。
よろしくお願いします。

エラーメッセージ

error

1ORA-01722: 数値が無効です

該当のソースコード

SQL

1SELECT t1.番号,t1.氏名, CASE WHEN t2.A IS NULL THEN t3.B ELSE t2.A AS 結果 2FROM 3 ( SELECT no AS 番号, name AS 氏名 FROM Table1 where flg=1) t1 4LEFT OUTER JOIN 5 ( SELECT no, A FROM Table2 WHERE no IS NOT NULL) t2 6ON t1.no=t2.no 7LEFT OUTER JOIN 8 ( SELECT no, B FROM Table3 WHERE no IS NOT NULL) t3 9ON t1.no=t3.no 10WHERE t2.A IS NOT NULL OR t2.B IS NOT NULL 11ORDER BY t1.番号 12;

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

・下記が似ている事象だと思ったが、本件にどう反映すればよいかわからない
https://stackoverflow.com/questions/50715524/ora-01722-when-trying-to-use-order-by

・SELECT文のCASEが悪さしてると思い、コメントアウトしたが同じくORA-01722だった

・「ORDER BY to_number(t1.番号)」としても同じくORA-01722だった

補足

実行環境はSQL Developerです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2024/11/13 05:17 編集

>table3にのみ存在する場合:table2のデータ は無理があるかと・・・(多分typoでしょう) 具体的なサンプルがあれば例示ください
yamapi1012bs

2024/11/13 05:18

ご指摘ありがとうございます。修正しました。
yamapi1012bs

2024/11/13 05:21

申し訳ありません、サンプルも無くお渡しできるものがありません・・・。
yambejp

2024/11/13 05:31 編集

では、条件をもうすこし明確にしてください table2、table3についてnoカラムはユニークで、指名についてはtable2はA、table3はBカラムを参照するということですね? nullか存在しないかの判定も微妙なのですが、たとえばtable2のno=1、A=nullの場合とno=1が存在しない場合、前者はデータは存在するけどtable3を返すのでしょうか?table2のno=2、A=nullでtable3のno=2、B=nullのときはどうするのでしょうか?
yamapi1012bs

2024/11/13 05:31

はい、table1~3において、noはユニークです。 table2はA、table3はBを参照するというのも認識あっています。
yamapi1012bs

2024/11/13 05:37

>たとえばtable2のno=1、A=nullの場合とno=1が存在しない場合、前者はデータは存在するけどtable3を返すのでしょうか? はい、table3にno=1、B != null のデータがある場合、table3のデータBを出力する想定です。後者(table2にno=1が存在しない)でも同じです table3のレコードもno=1、B= nullの場合、行を出さない想定です。(LEFT OUTER JOINを使用しているため、AもBもnullも存在すると思うため、10行目のWHERE句で潰しているつもりです。) >table2のno=2、A=nullでtable3のno=2、B=nullのときはどうするのでしょうか? 行を出さない想定です。10行目のWHERE句で潰しているつもりです。
yambejp

2024/11/13 05:43

回答の方にサンプル上げてあります 結果があっているかどうか検証ください
guest

回答1

0

ベストアンサー

サンプルデータを例示します以下認識あっていますか?
(書式がmysqlなのでsql serverで一部書き直す必要があるかも)

サンプルデータ

SQL

1create table tbl2(no int primary key,A varchar(20) null); 2insert into tbl2 values 3(1,'a1'),(2,'a2'),(4,'a4'),(5,null),(6,null),(7,null); 4create table tbl3(no int primary key,B varchar(20) null); 5insert into tbl3 values 6(1,'b1'),(3,'b3'),(4,null),(5,'b5'),(6,null),(8,null);

クエリ

SQL

1select tbl1.no,coalesce(tbl2.A,tbl3.B) as name from( 2select no from tbl2 3union select no from tbl3 4) as tbl1 5left join tbl2 on tbl1.no=tbl2.no 6left join tbl3 on tbl1.no=tbl3.no 7order by tbl1.no

※full outer joinしてそれにleft joinでつなぐ

結果

noname
1a1
2a2
3b3
4a4
5b5
6NULL
7NULL
8NULL

投稿2024/11/13 05:43

編集2024/11/13 05:47
yambejp

総合スコア116443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamapi1012bs

2024/11/13 06:03

回答ありがとうございます。試してみましたが解決できませんでした。 ・table2,table3に実際には別のwhere句があり、UNIONできない ・no6~8はレコード自体が出てこない想定(上記で言うとno1~5の5行が出る想定)
yamapi1012bs

2024/11/13 06:05

回答ありがとうございます。 実は原因が別にあったようで、解決しました! 根気強くご教示いただきありがとうございます。 ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問