人に聞けない痔の悩み、これでスッキリ >>

Oracle初心者です。
以下のようなエラーがSQL*Plusで出てしまうのですが
何がいけないのかよくわかりません。
dt.KAISU = 5 と記述すればうまくいくのですが...
ご教授くださ~い。

SQL> UPDATE DATARECORD dt SET
 2     dt.KAISU = CASE
 3           WHEN NVL(dt.GOKEI,0)
 4             < 5
 5           THEN dt.GOKEI
 6           ELSE 5
 7           END
 8  Where NVL(dt.GOKEI,0) <> 0
 9 ;
         ELSE 5
            *
6行でエラーが発生しました。
ORA-00932: データ型が一致しません。

A 回答 (1件)

SQLのCASE式では、どの条件にマッチした場合でも、同じ型の値を返す必要があったはずです。


おそらくdt.GOKEIの型と5の型(Number?)が一致していないと思うのですがどうでしょうか?
(DATARECORDのテーブル定義がわからないので、なんともいえませんが…。)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Q(日付 - 日付)/数値

日付の計算で、(日付 - 日付)/数値は期間らしいですが、どのように使っているのですか?実例ありますか?

Aベストアンサー

>>select to_date(20091211) - to_date(20091204) / 7 from dual
>>→ORA-00932: データ型が一致しません: NUMBERが予想されましたがDATEです。
>(日付 - 日付)は、to_numberでくくって数値に変換してから割り算しないと、エラーになるのですね。

to_numberで数値化しないのが問題なのではなく、カッコを忘れてるから、
日付型と数値の演算になってるのがエラーの理由です。
select (to_date(20091211) - to_date(20091204)) / 7 from dual
のように、質問のような式であれば、to_numberなしでも結果は戻ります。

Q実行計画の「COST」と「BYTE」について教えていただきたいです。

実行計画の「COST」と「BYTE」について教えていただきたいです。

書籍には
COST・・・・CBOによって見積もられた操作コスト。
BYTE・・・・アクセスされるバイト数のCBOのアプローチによる見積もり。
と書かれていますが、いまいちピンときません。


私は、
COSTは、検索するテーブルのデータ量が多いほうがコスト値が大きくなる。
BYTEは、検索条件に合致して取得できるデータが多いほうがバイト値が大きくなる。
と思っているのですが、正しいでしょうか?

Aベストアンサー

このあたりを参考にしてください。
COSTはデータ量だけではなく、その表やViewのアクセスに要する時間やSortや結合が必要なら、そのために必要なCPU時間等も考慮されています。
表があるHDDのアクセス速度なんかも考慮されているし、表のエクステントが複数になっているかとかも考慮されています。
書籍はわかりにくいかもしれませんが、嘘は少ないと思います。著者が思い違いをしてないとは言い切れませんが。

参考URL:http://otn.oracle.co.jp/forum/message.jspa?messageID=35016743

QCASE文のエラーについて

下記のように打つと「行1でエラーが発生しました。:
ORA-00905: キーワードがありません」というエラーが表示されます。どうすればいいでしょうか?

SELECT ENAME AS 名前, SAL AS 給与, CASE SAL WHEN SAL <= 1100 THEN SAL * 1.055 WHEN SAL <=1400 THEN SAL * 1.05 WHEN SAL <=3000 THEN SAL * 1.0 ELSE SAL*1.045 AS 昇給率 FROM EMP;

Aベストアンサー

2カ所誤りがあります。

1つ目

CASEに対するENDがない。(#1の指摘の通り)

2つ目

"CASE"キーワードの次に比較要素を書いていますが、
そぼ場合、"WHEN"キーワードの次に書くのは、比較式でなく
比較要素になります。

case ○ when △ then ▲ when □ then ■ else ◆ end

case when ○=△ then ▲ when ○=□ then ■ else ◆ end
は、同じ意味のCASE式ですが、これをゴチャゴチャに使っているのが、
間違いです。

SELECT
 ENAME AS 名前,
 SAL AS 給与,
 CASE WHEN SAL <= 1100 THEN SAL * 1.055
    WHEN SAL <=1400 THEN SAL * 1.05
    WHEN SAL <=3000 THEN SAL * 1.0
    ELSE SAL*1.045
 END AS 昇給率
FROM EMP;

のように書くと問題なく使えるかと思います。

2カ所誤りがあります。

1つ目

CASEに対するENDがない。(#1の指摘の通り)

2つ目

"CASE"キーワードの次に比較要素を書いていますが、
そぼ場合、"WHEN"キーワードの次に書くのは、比較式でなく
比較要素になります。

case ○ when △ then ▲ when □ then ■ else ◆ end

case when ○=△ then ▲ when ○=□ then ■ else ◆ end
は、同じ意味のCASE式ですが、これをゴチャゴチャに使っているのが、
間違いです。

SELECT
 ENAME AS 名前,
 SAL AS 給与,
 CASE WHEN SAL <= 1100 THEN...続きを読む

QUPDATE文のWHERE条件に他のテーブルのフィールドも入れたい

SQL文についてです。

表Aで列1と列2が'◎'のものについて、列3,列4,列5をそれぞれ'○','△','×'に更新したい場合は下記でOKだと思います。
UPDATE 表A
SET 列3 = '○', 列4 = '△', 列5 = '×'
WHERE 列1 = '◎' AND 列2 = '◎'

列1と列2をキーとして表Aと結合できる表Bが存在するとします。
条件に表Bの列6が'□'だった場合を追加したい時、どのような方法で行えば良いのでしょうか?
内部結合やWHERE EXISTSなどをいろいろ調べたのですが、SQL文に慣れていないためかうまくいきません。
初歩的な質問で申し訳ありませんが過去質問で参考になるものがなかったのでお願いします。

Aベストアンサー

UPDATE 表A
SET 列3 = '○', 列4 = '△', 列5 = '×'
WHERE 列1 = '◎' AND 列2 = '◎'
AND EXISTS
( SELECT 1 FROM 表B
WHERE 表B.列1 = 表A.列1
AND 表B.列2 = 表A.列2
AND 表B.列6 = '□' )
じゃだめですか。

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

Q文字列として"(ダブルコーテーション)を表示させる方法

こんにちは。文字列として、ダブルコーテーションを表示させるには、どうすればよいのか教えてください。m(__)m


例えば、
<font size="2">あいうえお</font>

というタグの「あいうえお」の部分が、セルA1にあった場合、

="<font size="2">"&A1&"</font>"という表示にしたいのです。

"2"のダブルコーテーションも文字列として表示させるには、どうすればよろしいのでしょうか。

教えてください。よろしくお願い致します。

Aベストアンサー

こんにちは~

表示形式は 「標準」 のままで、
ダブルコーテーションを、ダブルコーテーションで囲んでください。

""2""

="<font size=""2"">"&A1&"</font>"

としてみてください。

Q単一グループのグループ関数ではありません。

オラクル10を使っています。

select NAMAE max(TEN) from KYOUKA WHERE OK=1 and CLASS IS ('A', 'B', 'C');

で単一グループのグループ関数ではありません。
というエラーになります。

CLASS | OK | NAMAE | TEN |
--------------------------
A 1 a01 50
A 1 a02 60
B 1 b01 10
C 1 c01 70
C 0 c02 100

a02 60
b01 10
c01 70
という結果になってほしいです。

Aベストアンサー

SQLの根本的な文法が理解できていないのかと

GROUP BY 句について調べてみましょう


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング