• 締切済み

「&」ってなんですか?

下記のCASE式の中で質問があります。  ****CASE式の使用例***************************************  SQL> set serveroutput on  SQL> DECLARE  2 v_selecter CHAR(1) := '&ランク';  3 v_result VARCHAR2(40);  4 BEGIN  5 v_result := CASE v_selecter  6 WHEN 'A' THEN '合格!'  7 WHEN 'B' THEN 'ぎりぎり合格!'  8 WHEN 'C' THEN 'もっと勉強せよ!'  9 ELSE 'ランク外。。。'  10 END;  11 DBMS_OUTPUT.PUT_LINE('評価:' || v_result);  12 END;  13 /  ランクに値を入力してください: c  旧 2: v_selecter CHAR(1) := '&ランク';   新 2: v_selecter CHAR(1) := 'c';   評価:ランク外。。。  PL/SQLプロシージャが正常に完了しました。  ******************************************************* 変数宣言部分「v_selecter CHAR(1) := '&ランク';」なんですが 「'&ランク'」では一体どのような処理行われているのですか??? 「&」が何かのキーワードであるはずで それを参考本などから調べてもどれも「&」には触れず サラッと流れているんです(T□T;) なぜ値の入力が求められてくるのですか? どなたかこの処理内容をを教えてください!

  • HANNO
  • お礼率65% (25/38)
  • Oracle
  • 回答数2
  • ありがとう数4

みんなの回答

回答No.2

'&ランク'は置き換え文字になります。 これは「sql*plusユーザーズガイドおよびリファレンス」に載っています。 '&ランク'という文字を設定(初期化)しているわけではありません。 (サイズ的に無理です。)

HANNO
質問者

お礼

「置換変数」 今ガイドで調べてみました。 便利なサイトがあるんですね! ご協力ありがとうございました。

回答No.1

普通に文法から考えて'c'も'&ランク'も両方ELSEの'ランク外。。。'になるのは当たり前の訳で・・・。 ''で囲まれていればそれは全て文字列であるので、&がキーワードになっていることは考えられません。 'c'で'もっと勉強せよ!'が出てこないのは、'C'でないから・・・。 大文字と小文字は区別されますよ。

HANNO
質問者

補足

なるほど~。 大文字と小文字は区別されるんですね。 ありがとうございます!「 あとひとつ質問よろしいですか? ではCASEで「v_selecter」の値を比較をしているのですが 初期設定では「&ランク」で設定していますよね? その後「ランクに値を入力してください: 」という プロンプト的な動きが出るのはどうしてでしょうか??? その入力した値でCASE文比較に入っているんです。。。

関連するQ&A

  • case構文の条件について

    cseで ------------------------------- SELECT a,b, CASE c WHEN 1 THEN "○" WHEN 0 THEN "×" END from A ; ------------------------------- というSQL文を実行すると カラムa,bには値が入っていますが カラムcは空欄になってしまいます。 CASE構文のところを、 ------------------------------- CASE c WHEN 1 THEN 1 WHEN 0 THEN "×" END ------------------------------- とするとカラムcの取得結果は、 1 × になります。 どうやら、THENを両方全角文字にすると空欄に なるようです。 ちなみにカラムcは"tinyint(1)"です。 "varchar(10)"にしても取得結果は 同じになってしまいます。 なぜこうなるのか、また、 どうやったら"○×"に限らず全角文字を 条件に出来るか教えてください。

  • CASE式を使ったクエリ

    <環境>SQLSERVER2005 件名について教えてください。 テーブル("TBL")にフィールドMONEY1~MONEY12までがあります。 MONEYの後ろの数字は月を表しています。 このテーブルから 1.MONEY12の値≠0円ならMONEY12の値。MONEY12の値=0円ならMONEY11の値を参照。 2.MONEY11の値≠0円ならMONEY11の値。MONEY11の値=0円ならMONEY10の値を参照。 3.MONEY10の値≠0円ならMONEY10の値。MONEY10の値=0円ならMONEY9の値を参照。 と0円でない月までさかのぼってその月の金額を求めたいのですが、 下記のようにCASE式を使うと「Case 式は、10 レベルまでしか入れ子にできません。」と エラーになります。 条件式が11レベル以上の場合抽出する方法はないのでしょうか SELECT CASE WHEN MONEY12>0 THEN MONEY12 ELSE CASE WHEN MONEY11>0 THEN MONEY11 ELSE CASE WHEN MONEY10>0 THEN MONEY10 ELSE CASE WHEN MONEY9>0 THEN MONEY9 ELSE CASE WHEN MONEY8>0 THEN MONEY8 ELSE CASE WHEN MONEY7>0 THEN MONEY7 ELSE CASE WHEN MONEY6>0 THEN MONEY6 ELSE CASE WHEN MONEY5>0 THEN MONEY5 ELSE CASE WHEN MONEY4>0 THEN MONEY4 ELSE CASE WHEN MONEY3>0 THEN MONEY3 ELSE CASE WHEN MONEY2>0 THEN MONEY2 ELSE CASE WHEN MONEY1>0 THEN MONEY1 ELSE 0 END END END END END END END END END END END END FROM TBL

  • グループ化データの割り算について

    SQLSERVER 言語 VB VS2008 いつも勉強させていただいています。 SQL文で 「0 除算エラーが発生しました。」 が出て、困っています。 アドバイスお願いいたします。 SQL文 COUNT(CASE WHEN CONVERT(CHAR(10), 納期, 111) = GETDATE() _ AND 入荷数 = 0 THEN 0 ELSE NULL END) _ / _ COUNT(CASE WHEN CONVERT(char(10), 納期, 111) = GETDATE() _ THEN 0 ELSE NULL END) * 100 AS '遅延率(%)' ・・・GROUP化 わかりずらいのですが、期間内の入荷数/全体数で割っています。 COUNTでも駄目でした。 個々のデータは取得できます。下記 COUNT(CASE WHEN CONVERT(CHAR(10), 納期, 111) = GETDATE() _ AND 入荷数 = 0 THEN 0 ELSE NULL END) AS 未入荷計 何か良い方法が御座いましたらご指導くださいませ。 よろしくお願いします。

  • SQL分の作り方

    以下のようなテーブルがあります name point date A 1 2014/1/1 B 2 2014/1/1 C 3 2014/1/1 A 1 2014/2/1 B 3 2014/2/1 C 2 2014/2/1 A 2 2014/3/1 B 4 2014/3/1 C 3 2014/3/1 上記のテーブルを name point(2014/1) point(2014/2) point(2014/3) A 1 1 2 B 2 3 4 C 3 2 3 というように並べるにはどのようなSQLを打てばよいでしょうか。 以下のようなSQLを打ってみたらデータ量が多いときになかなか応答が帰ってきません。 SELECT name, ifnull(sum(CASE WHEN date = '2014-01-01' THEN point END),'-') as point(2014/1),ifnull(sum(CASE WHEN date = '2014-02-01' THEN point END),'-') as point(2014/2),ifnull(sum(CASE WHEN date like '2014-03-01' THEN point END),'-') as point(2014/3) FROM tableA GROUP BY name

  • caseを使った条件分岐の加算がうまくいかない

    SQLで条件によって加算するか、しないかを判定したいと思っています。 ■テーブル:test name,flag,number mike,4,1 mike,4,2 mike,5,3 mike,6,4 mike,7,5 mike,8,6 mike,9,7 ■書いたSQL SELECT test.name AS "name", (CASE WHEN flag = '4' THEN sum(number) ELSE NULL END) AS "4", (CASE WHEN flag = '5' THEN sum(number) ELSE NULL END) AS "5", (CASE WHEN flag = '6' THEN sum(number) ELSE NULL END) AS "6", (CASE WHEN flag = '7' THEN sum(number) ELSE NULL END) AS "7", (CASE WHEN flag = '8' THEN sum(number) ELSE NULL END) AS "8", (CASE WHEN flag = '9' THEN sum(number) ELSE NULL END) AS "9" FROM test GROUP BY test.name ■結果 4,5,6,7,8,9 null,null,null,null,null,28 欲しい結果は、フラグが4ののものの合計。flagが「4」の場合は、「3」という結果が返ってきてもらいたいです。 flagが5の場合は、3が返ってきてもらいたいです。 SQLが間違っているのですが、どこが間違っているのかわかりません。どのように修正すればよろしいでしょうか?よろしくお願いします。 環境はSQLiteを使用しています。

  • SQLの構文エラー

    いつもお世話になってます。 現在、VBでSQLを発行し、ACCESSのテーブル(テストデータ)より 値を取得しようとしているのですが、 SQL文の発行時に構文エラーとなってしまいます。 詳細を下記しますので、ご教授頂けたらと思います。 宜しくお願い致します。 【SQL文】 select フィールド1,フィールド2,フィールド3,フィールド4,フィールド5,フィールド6,フィールド7, (CASE WHEN フィールド8='4' or フィールド8='5' then フィールド9*-1 else フィールド9 end)あああ, (CASE WHEN フィールド8='4' or フィールド8='5' then フィールド10*-1 else フィールド10 end)いいい from テストデータ ※フィールド9、フィールド10は数値型、その他はテキスト型です。 実行時エラー'3075' クエリ式'(CASE WHEN フィールド8='4' or フィールド8='5' then フィールド9*-1 else フィールド9 end)あああ'の構文エラー:演算子がありません。

  • Order by句でバインド変数を使うには?

    SQL文のOrder by句で2つのバインド変数を用いて、ソートする項目・ソート順を決めたいと思い、以下のようなSQLを作成いたしました。 Select row_Number() Over(Order by Case :ITEM When 'PJコード' then PJコード When '部署コード' then 部署コード end Case :LINE When '1' then DESC When '2' then ASC end .... バインド変数を直接Order by句に入れますと、結果は帰ってくるのですが、バインド変数の値がすべて無視されてデータが出力されます。 以上の理由より、Case文にてバインド変数の値を参照し、ソートする項目と順番を決めております。 上記のソースで実行しますとORA-00907:右かっこがありませんというエラーが表示されます。 2つ目のCase文(:LINE)を消し、最初のCase文だけを残して、並び順(DESC・ASC)を埋め込むと、実行される状態になります。 Oracleのバージョンは11gです。 ご回答よろしくお願いいたします。

  • 特定条件でWHERE句の条件を変更したい

    @jouken int @sql varchar(MAX) @select varchar(MAX) @where varchar(MAX) set @select = 'select * from table1' set @where = ' where case when @jouken = 0 then 'field1 = 1' when @jouken = 1 then 'field1 = 1 or field2 = 1' when @jouken = 2 then 'field1 = 1 or field2 = 1 or field3 = 1' end ' set @sql=@select+@where exec(@sql) 上記のような文字列の組み合わせでの作成でやりたいことはできたのですが、 こちらを直接SQLの中でやりたいのです。 以下の文は機能しません。 select * from table1 where case when @jouken = 0 then field1 = 1 when @jouken = 1 then field1 = 1 or field2 = 1 when @jouken = 2 then field1 = 1 or field2 = 1 or field3 = 1 end ご教授の程、よろしくお願い致します

  • オーダーNo.毎に集計するSQL

    オーダーNo.毎に集計するSQLを考えているのですが、少しSELECT文法で行き詰まってしまったので教えてください。 オーダーNo.毎にグループ化して、コード別の件数を集計します。 そして、コードが「10」のものが1件でもあれば表示する、というようなことを考えています。 SELECT ORDERNO, SUM(CASE WHEN CODE = 0 THEN 1 ELSE 0 END) AS CODE0, SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) AS CODE10, SUM(CASE WHEN CODE > 0 THEN 1 ELSE 0 END) AS CODEALL FROM DBORDER WHERE SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) > 0 GROUP BY ORDERNO ORDER BY ORDERNO このようにすると、WHEREのところで構文エラーになります。 ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。 よろしくお願いします。

  • SQL Server Where句 Case文

    お世話になります。 Where句のCase文でお尋ねしたいことがあります。 ----------------------------------------------------- WHERE (A = @A) AND (B = @B) AND (C = @C) AND CASE WHEN @D = 0 THEN (dbo.TEST.D = dbo.TEST.D) '全データを WHEN @D = 1 THEN (dbo.TEST.D = 1) '値が1のデータを WHEN @D = 2 THEN (dbo.TEST.D = Is Null) 'データがNull のものを END AND (E = @E) AND (F = @F) AND (G = @G) AND (H = @H) AND CASE WHEN @I = 0 THEN (dbo.TEST.I = dbo.TEST.I) WHEN @I = 1 THEN (dbo.TEST.I = 1) WHEN @I = 2 THEN (dbo.TEST.I = Is Null) END AND (J = @J) ........ ........ ----------------------------------------------------- 上記のように CASE 文で パラメータの値により条件を変えたいのですが、なかなかうまくいきません。こんな記述の仕方ではダメということは薄々わかっているのですが、このようなCASE文をうまく動作させるにはどのように記述すればいいでしょうか? よろしくお願いいたします。