• ベストアンサー

Oracleのnull

ちょっとオラクルの検索文で困ったことがでてきました。 temp ------- col1 col2 col3 と言うようなテーブルがあります。 select col1 || '(' || col2 || ')' as col from temp; というような検索文を作成しましたが、テーブルのcol1とcol2が両方とも nullのデータは'()'となってしまいます。 col1とcol2は片方だけがnullと言うことはありません。 col1がnullの場合はcol2もnullです。 このような場合col1とcol2がnullの時は、結果のcolもnullにしたいのですが どうしたら出来るのでしょうか? また、無理なら無理と教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • takopon
  • ベストアンサー率69% (27/39)
回答No.2

少々面倒ですが、DECODE関数を使ってみたらどうでしょうか。 DECODE関数は条件置換を行うことの出来る関数です。 DECODE(COL,'A',1,'B',2,3) とかくと、COLの値が'A'のときは1、'B'のときは2、それ以外は3 が返されます。 ですので、 select col1 || decode(col2,null,null,'(') || col2 || decode(col2,null,null,')') as col from temp; でうまくnullになるのではないでしょうか。 decodeはネストすることも出来ますので、 select col1 || decode(col1,null,decode(col2,null,null,'('), null,'(') || col2 || decode(col1,null,decode(col2,null,null,'('), ,')') as col from temp; でさらに正確に置換することが出来ます。 こんなところでどうでしょうか。

hilo256
質問者

お礼

有難うございます。詳しい説明でわかりやすかったです。

その他の回答 (1)

  • timber
  • ベストアンサー率29% (218/739)
回答No.1

select decode(col1, null, null, col1 || '(' || col2 || ')' ) as col from temp; 上記でできると思います。

hilo256
質問者

お礼

有難うございます。オラクルって本当に便利ですね。

関連するQ&A

  • oracleでwith句の結果を使ってupdate

    oracleでwith句の結果を使って外部結合?でupdateしたいのですが 上手くいきません。 oracleでは無理なのでしょうか。 よろしくお願いいたします、。 /*---------- with v1 as ( select row_number() over(PARTITION BY ・・・ ORDER BY ・・・) as rnum ,no ,col1 ,・・・ from ・・・ ) update ( select A.col1 A_COL, v1.col2 B_COL from table1 A inner join table2 B on A.cd1=B.cd1 inner join v1 on A.no=v1.no where v1.rnum=1 and ・・・ ) set A_COL=B_COL ; ----------*/ と書いたのですが、 実際に実行してみると、 カッコ「(」、「)」がないとか、 selectが必要とか, A_COLやB_COLが無効ですとか、 となります。 どこが悪いのでしょうか。 oracleではupdateでwithは使えないのでしょうか。 よろしくお願いします。

  • 連結演算子で結合すると値がNullだと表示出来ない

    SQLで連結演算子(||)を使って、col1とcol2を連結させたいのですが、 どちらかの列の値がNullだと結果がNullでかえってきてしまいます。 Select col1 || '/' || col2 As set_col From table_name; col1には必ず値が入っているのですが、col2には値が入るとは限りません。 表示させる解決策はあるのでしょうか?

  • ORA-01861について

    Oracleで同一インスタンスの別スキーマに同じテーブル構成を作り開発環境としています。 そこで下記のSQL文を実行しようとすると、あるスキーマでは正常に検索されるけど別のスキーマでは 「ORA-01861 リテラルがフォーマット文字列と一致しません」 とのエラーメッセージが出力されます。 また困ったことに別マシンから同様の検索を行うとどのスキーマでも正常に検索が行われます。 Net8とかOracleクライアントの設定の問題でしょうか? DBサーバはOracle10g、クライアントは前者のマシンがOracle8i、後者のマシンにOracle9iがインストールされています。 【対象SQL文】 SELECT * FROM (SELECT TEMP.*, ROWNUM AS RM FROM (SELECT TEST.COL1, TEST.COL2 FROM TEST WHERE (COL1 = 'Dummy') AND COL2 = '1' AND DATE_COL <= '2005-11-04 12:00:00.0' -- ※この行に対して「ORA-01861」が発生しています。 ) TEMP ) WHERE RM >= 1 AND RM <= 300 ORDER BY RM /

  • Nullを含む条件の検索

    Nullを含む条件の検索 Oracle10g利用して勉強中の初心者です。 Hinテーブル NO Hin Flg 1 卵 1 2 鯉 null 3 糸 0 SELECT * from Hin Where not Flg = 1 としてFlgが1以外のレコードを取得したいのですが Nullは判断しなくて困っています、 良い方法は無いでしょうか? よろしくお願いします。

  • ORACLEでwhere句の検索順序

    Oracle9i windows2000です。 以下のようなテーブルがあります。 table_a ----------------------- id   NUMBER(10,0) NOT NULL, sort   NUMBER(10,0) NOT NULL, name   VARCHAR(10), text   VARCHAR(255) この条件で、以下のふたつのSELECT文を発行した時、パフォーマンスが良いのはどちらですか? Oracleでは後ろから検索されると聞いたことがあるのですが本当でしょうか? ※idにプライマリキー、 id,sortにインデックスが貼ってあります。 (1)SELECT text FROM table_a WHERE id = 1 AND sort = 2 AND name = 'a' (2)SELECT text FROM table_a WHERE name = 'a' AND sort = 2 AND id = 1

  • Oracle 条件の場合分け

    OracleのSQL文について質問です。 条件1がNULLのときは、条件2を検索条件としてSELECTを行いたいのですが、表現が可能でしょうか? SELECT * FROM TABLE WHERE (条件1がNULLでなければ、「条件1=XXXX」を条件とし、条件1がNULLであれば「条件2=XXXX」を条件とする) ということはどのように表現すればよいのでしょうか? 条件の場合分けのようなことはできるのでしょうか? データベース初心者で行き詰ってしまいました。 ヒントだけでも頂ければ、幸いです。 何卒よろしくお願いいたします。

  • SQLServer7.0で、SELECT文で列を抽出する ※Nullと0の条件について

    SQLServer7.0で、SELECT文で列を抽出する際なんですが、 列A 列B --------- 1  Null 2  Null 3  1 ↑のテーブルから、列Aの1、2だけを抽出するSELECT文を SELECT * FROM XXX WHERE 列B <> 1 と作成したのですが、うまく動作しません(汗) データが一件も取れないのです。(列B:tinyint型、Null許容) テーブル内のデータをNull→0にして、同SELECT文で抽出すればうまくいったのですが。。 Nullデータを、<>XX という条件で取得することはできないんですかねえ・・・。 それとも、テーブルの設定か、条件の記述方法がまずいんでしょうか。 どなたか、ご存知あればアドバイスをお願いします。

  • 複数のテーブルの項目を同時に削除したい

    お世話になります、 Oracleで、delete文で困っています。 関係しあう二つのテーブルtab1,tab2があります。 二つのテーブルから同時に関係する項目を削除する 場合、同時に両方のテーブルの関係する項目を削除する場合どのような文になるのでしょうか、 delete from で複数のテーブルをしてすることはできないし、 delete from (select * from tab1,tab2)というような感じでデリートしても、片方のテーブルしかデリートされません。 よろしくお願いします。

  • 2つの表の整合をとる方法

    こんにちは、 オラクルで2つの同じ表を同じデータに保つ方法について悩んでいます。 A表、B表共 COL1 プライマリキー COL2 COL3 として。 両テーブルのデータをあわせこみたいのですが、 過去ログを調べたところ、他方に無いデータの獲得についてはありましたのでそれを参考にINSERT文を作成しました。 INSERT INTO B ( SELECT * FROM A WHERE NOT EXISTS ( SELECT * FROM B WHERE A.COL1 = B.COL1 )) 上記SQLでAにあってBにないレコードがBに追加される事を確認しましたが、 COL1が同じでCOL2またはCOL3が違う場合の UPDATE文をどの様に記述すればよいか分かりません。 どなたかご教授願えないでしょうか?。

  • インデックスを用いたbetween検索について

    Cで1~360000までのランダムな整数の列(col1)を含む100万件のデータを作成し(50MB弱)、 create table table1(・・・, col1 integer not null, ・・・); で作ったテーブルにload data infile文で挿入し、 create index index1 on table1(col1); でインデックスを作成しました。 select * from table1 where col1 between 1000 and 2000; といったような検索(約2500件ヒット)をしたいのですが、この検索ではインデックスを作らないテーブルのほうが速く検索できてしまいます。 select * from table1 where col1 between 100 and 200; のような検索(約250ヒット)ではインデックスの効果があり、高速検索ができますが。 環境はMySQL-5.0.26、ノートPC(256MB)、Fedora Core5、設定ファイルはMy-large.cnfを、ほぼそのまま使用しています。 上記のような少し大きめの検索範囲でもインデックスを用いた検索を改善する方法をご教授お願いします。何かのパラメータが決定的に足りないと思うのですが。