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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

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

Q&A

解決済

2回答

1275閲覧

SQL初心者で困っています

pak

総合スコア7

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

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

0グッド

1クリップ

投稿2016/09/26 05:34

お世話になっております。
tmpテーブルのc1〜c11というVARCHAR2型のカラムに対し、
①文字列「A」がどのカラムにも存在しないこと
②文字列「B」がいずれか1カラムに存在していること
を条件に対象レコードを抽出したいのですが、
上手くいきません…。
どなたかご教授いただきたいです。
よろしくお願いしますm

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

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

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

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

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

roast_chicken

2016/09/26 05:38

作成したSQLはどのような感じですか?
pak

2016/09/26 05:46

ありがとうございます。 SELECT * FROM tmp WHERE c1 <> 「A」 AND c2 …中略… AND (c1 = 「B」 OR c2 …中略…) です。PCからコピー出来ないためスマホで打っているので簡潔で申し訳ありません。「」は実際はシングルクォーテーションです。 おそらく①の条件がうまくいかず、「A」と「B」の両方を値に持ったレコードも抽出されてしまいまして、悩んでいます。
guest

回答2

0

ベストアンサー

すみません、全て読んでなかったので、SQL書き直します。

追記

SQL

1SELECT * FROM tmp 2WHERE (c1 NOT LIKE '%A%' AND ・・・ AND c11 NOT LIKE '%A%') 3-- c1~c11のいづれか1つ以上Bがある場合 4AND (c1 LIKE '%B%' OR ・・・ OR c11 LIKE '%B%')

投稿2016/09/26 05:52

編集2016/09/26 06:00
roast_chicken

総合スコア254

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

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

pak

2016/09/26 05:59

お手間をおかけしてしまい申し訳ありません。 ありがとうございます。よろしくお願い申し上げます。
pak

2016/09/26 06:11

追記いただきましてありがとうございます。 上記を元に試してみます。 ありがとうございますm
roast_chicken

2016/09/26 06:18

AとかBとかは例だとは思いますが、テーブルの設計を見直した方がよいかもしれません。 データ件数が多くなるとこのSQLはものすごく遅くなってしまうので。。。
pak

2016/09/26 06:23

実際は1カラム7byteなのですが、業務ですでに決められてしまっており、エラーコードをc1から順番に格納していくそうです。。 なぜこんな設計なのか、私も疑問に思っております…。 お早いご対応をいただきましたので、ベストアンサーにさせていただきます。
roast_chicken

2016/09/26 06:35

もしそうであるのであれば、少し乱暴ですが・・・ 全てのカラムを結合してみるものありかもしれません。 SELECT * FROM TMP WHERE CONCAT(c1,c2,・・・,c11) NOT LIKE '%A%' AND CONCAT(c1,c2,・・・,c11) LIKE '%B%'
roast_chicken

2016/09/26 06:36

NULLの項目があるので ISNULL関数で空文字に置換する必要がありますね。
pak

2016/09/26 06:57

ありがとうございます。 nullだと否定文が使えないと知らず…orz お教えいただいた結合と悩みましたが、ISNULL関数を使用してみます。 何度もご回答いただき誠にありがとうございます。
guest

0

全部答えると身につかないのでヒントを

SQL言語リファレンス INSTR
でINSTR構文を調べます。
これをUPDATE時のWHERE句に応用します。

SQL

1SQL> SELECT INSTR('123a567A', 'A') AS ANS FROM DUAL ; 2 3 ANS 4------------- 5 8

と8バイト目にAがあります。

SQL

1SQL> SELECT INSTR('123a567B', 'A') AS ANS FROM DUAL ; 2 3 ANS 4------------- 5 0 6

でAは見つからないので0がかえります。

②文字列「B」がいずれか1カラムに存在していること

いずれか1カラムにしか存在か、1カラム以上に存在のどちらでしょうか?

投稿2016/09/26 05:48

Orlofsky

総合スコア16415

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

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

pak

2016/09/26 05:58 編集

説明不足の上、文字列とお伝えしたことで誤解を招き恐れ入ります。 1カラムには、A、B、それ以外(Cなど)、nullのいずれかの値が入っています。 c1=A、c2=B、c3〜c11=nullのレコードは対象外、 c1=A、c2〜c11=他の値も対象外、 c1=null、c2=B、c3〜c11=他の値は対象、 といった抽出を行いたいです。
Orlofsky

2016/09/26 06:35

次の質問からCREATE TABLE文と共に上記の内容も載せてください。問題を整理していると質問する前に自分で解決できることもあります。 初心者マークがついていますから、タイトルに初心者と載せるのはやめましょう。タイトルは質問したい内容を想像できるものにしてください。
pak

2016/09/26 07:09

ありがとうございます。 業務に関わることで急ぎ質問したく、こちらのサイトを登録後、 他の皆さまの質問・回答を確認せず投稿してしまいました。 以後、Orlofskyさまにご指摘いただいた上記を気にして投稿いたします。 この度はご回答・ご指導ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問