• ベストアンサー
  • 困ってます

TO_NUMBERの結果は、カラムに追加できない?

いつもお世話になっています。 TO_NUMBER実行時、結果はnumeric型で取得できると思うのですが、 その値をカラムに追加することはできるのでしょうか? insert into number2 values((select numberStr,TO_NUMBER (numberStr,'000.000') from number),'aaa'); 実行すると、 副問い合わせは1列のみを返さなければなりませんというErrorが生じます。 なのでwhere句を追加しましたが、結果は同じです。 実行したsqlは、 create table number ( count integer not null primary key, numberStr varchar(20) not null ); create table number2 ( no numeric not null primary key, numberS varchar(30) not null); insert into number values(5,'555.55000'); insert into number2 values((select numberStr,TO_NUMBER (numberStr,'000.000') from number where count=5),'aaa'); です。 宜しくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数533
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.1
  • med2dic
  • ベストアンサー率77% (21/27)

>副問い合わせは1列のみを返さなければなりませんというErrorが生じます。 >なのでwhere句を追加しましたが、結果は同じです。 where句を追加したということは行と勘違いされているのでは? 『(select numberStr,TO_NUMBER (numberStr,'000.000') from number)』の部分で 「numberStr」と「TO_NUMBER (numberStr,'000.000')」の2列返しているという意味です。 「numberStr」の方を削除すればエラーにはならないと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

早速の回答ありがとうございます。 ご指摘の箇所を直したところ、無事解決できました。 insert into number2 values((select TO_NUMBER (numberStr,'000.000') from number where count=5),'aaa'); としたところ問題なく、追加されました。 ありがとうございました。

関連するQ&A

  • PLSQLのNumber型の初期化

    はじめまして。 Oracle11gで開発しています。 初歩の初歩の質問なのですが。 下記のように複数のレコードをまとめて、 INSERT先のテーブル(レコードを1個に)に入れ込むまでの処理です。 全てNUMBER型のテーブル列で、NOT NULL制御を施しています。 そのようにすれば、明示的にNULLは無くなり、「0」がデフォルトになると思ったのですが、 「tb_trn_aa_day_r.tx_00」はNULLのままでした。 初期化の「tb_trn_aa_day_r := null;」がまずいのでしょうか? ちなみに、tb_trn_aa_day_r.tx_00~tx_23に「0」をセットしてもなぜか、NULLとなり、 「tb_trn_aa_day_r.tx_sum」が全てNULLとなってしまいます。 初期j化はどのようにすべきでしょうか? よろしくお願いします。 /* Aデータ初期化 */ tb_trn_aa_day_r := null; IF c_aa_data_r.hour = '00' THEN tb_trn_aa_day_r.tx_00 := TO_NUMBER2(c_aa_data_r.tx); ELSIF c_aa_data_r.hour = '01' THEN tb_trn_aa_day_r.tx_01 := TO_NUMBER2(c_aa_data_r.tx); ELSIF c_aa_data_r.hour = '02' THEN tb_trn_aa_day_r.tx_02 := TO_NUMBER2(c_aa_data_r.tx); ELSIF c_aa_data_r.hour = '03' THEN tb_trn_aa_day_r.tx_03 := TO_NUMBER2(c_aa_data_r.tx); ..... ELSIF c_aa_data_r.hour = '23' THEN tb_trn_aa_day_r.tx_23 := TO_NUMBER2(c_aa_data_r.tx); END IF; dbms_output.put_line(tb_trn_aa_day_r.tx_00); /* 集計データ */ tb_trn_aa_day_r.tx_sum := TO_NUMBER2(tb_trn_aa_day_r.tx_sum) + TO_NUMBER2(c_aa_data_r.tx); /* INSERT処理 */ CREATE OR REPLACE function SYNONIM.TO_NUMBER2(str varchar2) return number is begin return to_number(str); exception when others then dbms_output.put_line('TO_NUMBER2 error: ' || SQLERRM); return 0; end; /

  • 2つのカラムの日付の範囲

    CREATE TABLE IF NOT EXISTS `events` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `start_on` date NOT NULL, `end_on` date DEFAULT NULL, PRIMARY KEY (`id`) ) ; INSERT INTO `events` ( `id` ,`start_on` ,`end_on` ) VALUES ( NULL, '2011-02-10', '2011-12-28' ); INSERT INTO `events` ( `id` ,`start_on` ,`end_on` ) VALUES ( NULL, '2011-03-01', NULL ); INSERT INTO `events` ( `id` ,`start_on` ,`end_on` ) VALUES ( NULL, '2011-04-01', NULL ); INSERT INTO `events` ( `id` ,`start_on` ,`end_on` ) VALUES ( NULL, '2011-04-10', '2011-05-10' ); INSERT INTO `events` ( `id` ,`start_on` ,`end_on` ) VALUES ( NULL, '2011-01-10', '2011-02-15' ); '2011-03' を渡したら2件帰ってくるような SQL 文を書きたいです。 (3月にやってるイベントの一覧を取得したい。) WHERE `start_on` BETWEEN '2011-03-01' AND '2011-03-31' だと1行目が取得できませんでした。 すみません。よろしくお願いします。

  • 同時アクセス

    例えば bigCategory,midleCategoryテーブルがあり、(今回はmiddleCategoryがbigCategoryときーでつながっている) create table bigCategory ( num integer not null primary key, name varchar(20) not null, ); insert into bigCategory values(0,'category_1'); insert into bigCategory valuers(1,'category_2'); create table middleCategory ( num integer not null primary key, name varchar(20) not null, bigkey integer not null ); insert into middleCategory values(0,'middle_1',0); insert into middleCategory values(1,'middle_2',1); bigCategoryの変更・削除をするときに、 1)middleCategoryがselectされている → 変更不可 2)middleCategoryがselectされていない →変更・削除可能 3)また、middleCategoryはselectされてなくて、 bigCategoryテーブルの変更行が他からselectされていたら、変更・削除不可 といった状況を実現したいのですが、可能なのでしょうか? 候補として、おもうはGRANTかな、と思ったりはするのですが。 いろいろ考えはするのですが、解決策が思いつかず質問させてもらいました。 宜しくお願いします。

  • Using temporary; Using filesort を回避したい

    はじめまして。よろしくお願いします。 下記の場合、Using temporary; Using filesort を回避するには どうしたらよいでしょうか。 次の 2 つのテーブルがあります。 CREATE TABLE `test1` ( `f1` int(11) NOT NULL, `f2` int(11) NOT NULL, PRIMARY KEY (`f1`,`f2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test1` VALUES ('1', '2'); INSERT INTO `test1` VALUES ('1', '3'); INSERT INTO `test1` VALUES ('1', '4'); INSERT INTO `test1` VALUES ('2', '1'); INSERT INTO `test1` VALUES ('2', '3'); CREATE TABLE `test2` ( `f1` int(11) NOT NULL, `f2` varchar(20) default NULL, `f3` varchar(20) default NULL, PRIMARY KEY (`f1`), KEY `ix_f2_f3` (`f2`,`f3`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test2` VALUES ('1', 'A', 'a'); INSERT INTO `test2` VALUES ('2', 'B', 'b'); INSERT INTO `test2` VALUES ('3', 'C', 'c'); INSERT INTO `test2` VALUES ('4', 'D', 'd'); 次の SELECT を実行すると Using temporary; Using filesort が 現れてしまいます。 explain select test2.f2, test2.f3 from test1, test2 where test1.f1 = 1 and test1.f2 = test2.f1 order by test2.f2, test2.f3; order by ... をなくすと問題ないのですが、ソートは必要です。 複数のキーに対してORDER BYを実行する場合 インデックスを使用できないとあるので ix_f2_f3 は使用されず Using filesort となるのはわかるのですが、 Using temporary となる理由と回避方法がわかりません。 ご教示よろしくおねがいいたします。

  • 最初に挿入された行だけ取得したい

    このジャンルでお願いします。 次のようなテーブルで CREATE TABLE IF NOT EXISTS user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user (name) VALUES ('user1'); INSERT INTO user (name) VALUES ('user2'); INSERT INTO user (name) VALUES ('user3'); CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (name) VALUES ('item1'); INSERT INTO item (name) VALUES ('item2'); INSERT INTO item (name) VALUES ('item3'); CREATE TABLE IF NOT EXISTS user_item ( id int(11) NOT NULL AUTO_INCREMENT, user_id INT, item_id INT, PRIMARY KEY(id), FOREIGN KEY (item_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (user_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user_item (user_id, item_id) VALUES (1, 1); INSERT INTO user_item (user_id, item_id) VALUES (2, 1); INSERT INTO user_item (user_id, item_id) VALUES (3, 2); INSERT INTO user_item (user_id, item_id) VALUES (1, 2); INSERT INTO user_item (user_id, item_id) VALUES (1, 3); INSERT INTO user_item (user_id, item_id) VALUES (3, 3); user_itemテーブルでのselectで、 user_idが1で一番最初に挿入された行だけ を取得したいのですが、どのようなSQL文にすれば良いのでしょうか? この例なら INSERT INTO user_item (user_id, item_id) VALUES (1, 1);←取得 INSERT INTO user_item (user_id, item_id) VALUES (2, 1); INSERT INTO user_item (user_id, item_id) VALUES (3, 2); INSERT INTO user_item (user_id, item_id) VALUES (1, 2);←user_id=3が最初に挿入されているので取得しない INSERT INTO user_item (user_id, item_id) VALUES (1, 3);←取得 INSERT INTO user_item (user_id, item_id) VALUES (3, 3);

    • ベストアンサー
    • MySQL
  • JDBCを使ってdate型へのINSERTはできますか?

    JDBCを使ってOracleへ接続し、DBへデータを挿入したいのですが、 日付型のデータがどうしてもうまく挿入できません。 jsp + Servlet + Bean で開発しています。 使っているテーブルは CREATE TABLE USERS (     USERID     VARCHAR2(10) NOT NULL,     PASSWORD  VARCHAR2(10) NOT NULL,     NAME      VARCHAR2(50) NULL,     SEX       VARCHAR2(5)  NULL,     BIRTHDAY   DATE       NULL,     PRIMARY KEY (USERID, PASSWORD) ) という風な型で、定義しています。 DBへのINSERT処理は、Beanで行っています。 以下のINSERT文を実行したのですが、うまくINSERTできませんでした。 String sqlQuery = "INSERT INTO USERS (USERID, PASSWORD, NAME, SEX, BIRTHDAY)" + "VALUES ('use', 'pass', 'ナマエ', '女性', '1980/06/05')" int numOfUpdate = statement.executeUpdate(sqlQuery); ちなみに、この中のdate型で定義している「BIRTHDAY」を除いたINSERT文 String sqlQuery = "INSERT INTO USERS (USERID, PASSWORD, NAME, SEX)" + "VALUES ('use', 'pass', 'ナマエ', '女性')" int numOfUpdate = statement.executeUpdate(sqlQuery); だとうまくINSERTできます。 sql*plusを使って直に書くと、両方うまくINSERTできました。 ●その後に、「BIRTHDAY」をdate型からVARCHAR2(10)へ定義し直し、  DBを作り直して実行した所、うまくINSERTできるようになりました。 なぜ「date型」だとINSERTできず、「VARCHAR2型」だとINSERTできるのか、 知っている方がおられましたら、ぜひ教えて頂きたいです。

    • ベストアンサー
    • Java
  • 指定した条件の組み合わせのSQL文

    SQLite バージョン3.7.10 を使用しています。 以下のようなテーブル構造で、 「t1」テーブルの全ての行と 「t6」テーブルのdateカラムの年の部分を グループ化して全ての組み合わせの 「t6」テーブルのamount の合計を出力したいのですが、 どのようなSQL文を書けば良いのでしょうか? 例えばこのデータ内容なら、以下のような結果が得たいです。 +------+-------+-------+ | year | t1_name | 合計 | +------+-------+-------+ | 2011 |t1_name1|  5000| +------+-------+------+ | 2012 |t1_name1| 10000| +------+-------+------+ | 2012 |t1_name2| 45000| +------+-------+------+ PRAGMA foreign_keys = ON; DROP TABLE IF EXISTS t6; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t1 (key, name) VALUES ('t1_key1', 't1_name1'); INSERT INTO t1 (key, name) VALUES ('t1_key2', 't1_name2'); CREATE TABLE t6 ( no INTEGER PRIMARY KEY AUTOINCREMENT, t1_key TEXT NOT NULL, date TEXT NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE ); CREATE INDEX date on t6(date); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key1', '2011-01-01', 5000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key1', '2012-01-01', 10000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key2', '2012-01-01', 15000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key2', '2012-02-01', 30000); http://ideone.com/I1mMba

  • SQL文について

    SQLite バージョン3.7.10 を使用しています。 次のようなテーブル構造で、 PRAGMA foreign_keys = ON; CREATE TABLE t1 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t1 (key, name) VALUES ('t1_key1', 't1_name1'); INSERT INTO t1 (key, name) VALUES ('t1_key2', 't1_name2'); CREATE TABLE t2 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t2 (key, name) VALUES ('t2_key1', 't2_name1'); INSERT INTO t2 (key, name) VALUES ('t2_key2', 't2_name2'); CREATE TABLE t3 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t3 (key, name) VALUES ('t3_key1', 't3_name1'); INSERT INTO t3 (key, name) VALUES ('t3_key2', 't3_name2'); CREATE TABLE t4 ( year TEXT NOT NULL, t1_key TEXT NOT NULL, t3_key TEXT NOT NULL, percent INTEGER NOT NULL, UNIQUE(year, t1_key, t3_key), FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE, FOREIGN KEY(t3_key) REFERENCES t3(key) ON DELETE CASCADE ); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2011', 't1_key1', 't3_key1', 10); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2012', 't1_key2', 't3_key2', 50); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2012', 't1_key2', 't3_key1', 100); CREATE TABLE t5 ( no INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT NOT NULL, t1_key TEXT NOT NULL, t2_key TEXT NOT NULL, t3_key TEXT NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE, FOREIGN KEY(t2_key) REFERENCES t2(key) ON DELETE CASCADE, FOREIGN KEY(t3_key) REFERENCES t3(key) ON DELETE CASCADE ); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2011-01-01', 't1_key1', 't2_key1', 't3_key1', 3000); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2011-02-02', 't1_key2', 't2_key1', 't3_key1', 2000); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2012-01-01', 't1_key2', 't2_key1', 't3_key1', 5000); 例えばテーブル「t5」から、 dateカラム=’2011’ t1_keyカラム= (テーブル「t1」のt1_nameカラム=’t1_name1’のt1_key1) t2_keyカラム= (テーブル「t2」のt2_nameカラム=’t2_name1’のt2_key1) という条件の含まれてる全ての対応する行に、 テーブル「t4」のpercentカラムとテーブル「t5」のamountカラムを 掛け合わせた数値の合計を出力する。 ただしテーブル「t4」に対応するt1_keyとt3_keyがなければ、 percentを「0」としてamountと掛ける。 例えばこの条件だと '2011-01-01'と'2011-02-02'の2つの行のamountの合計を求めることになりますが、 '2011-01-01'の方は、テーブル「t4」にpercent「10」があるので 3000×(10/100)=300 '2011-02-02'の方は、テーブル「t4」にpercentがない(対応する行がない)ので 2000×(0/100)=0 合計 300+0=300 という結果が得たいです。 これはどのようなSQL文になるのでしょうか?

  • 階層構造のテーブルの行の取得について

    このジャンルでお願いします。 次のようなテーブルで CREATE TABLE IF NOT EXISTS user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user (name) VALUES ('user1'); INSERT INTO user (name) VALUES ('user2'); INSERT INTO user (name) VALUES ('user3'); CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, parent_id INT, name varchar(32) NOT NULL, FOREIGN KEY (parent_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7'); INSERT INTO item (parent_id, name) VALUES (null, 'item8'); CREATE TABLE IF NOT EXISTS user_item ( id int(11) NOT NULL AUTO_INCREMENT, user_id INT, item_id INT, type varchar(16) NOT NULL, PRIMARY KEY(id), FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (item_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user_item (user_id, item_id, type) VALUES (1, 1, 'allow'); INSERT INTO user_item (user_id, item_id, type) VALUES (1, 3, 'deny'); INSERT INTO user_item (user_id, item_id, type) VALUES (1, 7, 'allow'); user_itemのuser_idが1のitemの行を取得したいのですが、 その条件として ・user_itemテーブルのtypeが'allow'のitem_id以下のitemの行 ・ただしtypeが'deny'のitem_id以下の行は除く この例だと、user_itemの INSERT INTO user_item (user_id, item_id, type) VALUES (1, 1, 'allow'); の行によってitemテーブルの INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); が取得候補になりますが、 INSERT INTO user_item (user_id, item_id, type) VALUES (1, 3, 'deny'); によって INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); の行は除かれ、 INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); の行が取得されます。 つまりitemテーブルにおいて上の階層の直近の(user_itemと結合して取得した)typeが 'allow'である場合のみ取得したいのです。 INSERT INTO item (parent_id, name) VALUES (null, 'item1');←取得 INSERT INTO item (parent_id, name) VALUES (1, 'item2');←取得 INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5');←取得 INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7');←取得 INSERT INTO item (parent_id, name) VALUES (null, 'item8'); 複雑ではありますが、これはどのようなSQL文にすれば良いのでしょうか?

    • ベストアンサー
    • MySQL
  • MySQL SELECTの指定について

    まず、御覧頂きありがとうございます。 早速質問なのですが、 CREATE TABLE `hoge` ( `id` int(8) NOT NULL, `name` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `hoge` (`id`, `name`) VALUES (1, 'hogeA'), (2, 'hogeB'), (3, 'hogeC'), (4, 'hogeD'); CREATE TABLE `test` ( `id` int(8) NOT NULL, `name` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test` (`id`, `name`) VALUES (1, 'testA'), (4, 'testD'); という値が入ってるテーブルがあるとします。(長くなってすみません) で、 hoge.id と test.id が重複した場合 test.name を表示させたいです。 期待値としては id,name 1.testA 2,hogeB 3,hogeC 4,testD になります。 業務でJoinを使うようなテーブル構造にそもそもしないというのもあり、クリティカルなSQLコードに不慣れで御知恵を借りたく質問させて頂きました。 よろしくお願いします。

    • ベストアンサー
    • MySQL