• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL における変数の宣言と代入の仕方)

SQLにおける変数の宣言と代入の仕方

このQ&Aのポイント
  • SQLで変数の宣言や代入を行う方法について説明します。
  • PostgreSQL8.1を使用している場合、SQLで変数を宣言し、重複して記述を避ける方法を知りたいです。
  • 関連キーワード: SQL assign, SQL variable

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

  • ベストアンサー
回答No.1

タイトルが悪すぎると思いますけど。 「同じような制約を何度も定義する必要がある」ということ自体が、問題なのでは? 同じような定義をたくさん行う必要があるというなら、SQLの動的実行(SQLを文字列で組み立てて前処理(prepare)して実行(execute))をすればいいのでは? その時に「星座名が必要」、「手作業でやったらタイプミスや重複して書き込むといった人員的なミスがある」といったことなら、事前に星座表(星座名で一意にしておく)を作っておいて、その検索結果をSQLの組み立てに利用(文字連結していく)すればいいと思いますよ。 そもそも、星座表を参照する参照制約にすれば、検査制約で星座名をだらだらと書く必要はないですけど。

uemurm
質問者

お礼

星座名自体も、別に表として保持するというのは、思いつきませんでした。今頃になってしまいましたが、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yamada59
  • ベストアンサー率74% (29/39)
回答No.2

ドメインを使うといいと思います。 ドメインというのは既存のデータ型に対して制約を加えて別の名前を付けたものです。 CREATE DOMAIN zodiac AS text CHECK (VALUE IN ('Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces')); CREATE TABLE t ( c zodiac ); ---- => INSERT INTO t VALUES ('Aries'); INSERT 0 1 => INSERT INTO t VALUES ('foo'); ERROR: value for domain zodiac violates check constraint "zodiac_check" ---- もしくは、列挙型を使ってもいいと思います。こちらのほうがより適切かもしれないです。 CREATE TYPE zodiac AS ENUM ('Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces'); CREATE TABLE t ( c zodiac ); ---- => INSERT INTO t VALUES ('Aries'); INSERT 0 1 => INSERT INTO t VALUES ('foo'); ERROR: invalid input value for enum zodiac: "foo" LINE 1: INSERT INTO t VALUES ('foo'); ----

参考URL:
http://www.postgresql.jp/document/current/html/sql-createdomain.html
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Access/ADOを使って変数にSQL文を入れた場合の変数の内容の確認

    お知恵をかしてください。 Access2000を使用しています。 VBAのADOを使ってデータベースの操作しています。 モジュールにSQL文を入れたい時は変数を文字列で宣言して記述するのですが、 書きたいSQL文に例えば下記のような計算式を入れたい場合 『&』と『"』が 変数の宣言が文字列なのでくっついて消えてしまいますよね? 変数= sql文 と Format(Mid([FieldName],1,4) & "/" & Mid([FieldName],5,2) & "/" & Mid([FieldName],7,2),"yyyy/mm/dd") そこで、デバッグプリントをしてイミディエイトで実際いまの変数の値はどうなってるのかを確認しながら、 『"』と『&』をつけ足したりしたいのですが、 SQL文が間違っているとデバッグプリントのところに行く前に構文エラーで落ちてしまう為、確認できません。 間違いを探したいからデバッグしているのに、どうすれば良いか分かりません。 何か記述した変数内容がどうなっているのか、確認する方法はないでしょうか? うまく説明ができず、分かりづらいかもしれませんが、ご回答いただければ幸いです。

  • バインド変数について

    PL/SQLのバインド変数について調べていますが理解できず困っています。 [理解内容] 1.利点  :SQL文の検索にバインド変数を利用すると、同一のSQLとして実行できる   ⇒ 繰り返し処理(ループ)では有効 2.使用方法  :静的SQL・動的SQLで使用可能   [疑問点]   静的SQLではバインド変数をどう宣言すればよいですか?   [SQL*Plus]・[動的SQL]は例文がありました   ●SQL*Plusでの宣言方法    (例)     SQL> set null '<null>'     SQL> set head off     SQL> variable var_at_sqlplus number   ●動的SQLの記述方法    (例)     declare      v_sql varchar2(256);      v_id varchar2(3);     begin      v_sql = 'select id into :v_id from test';      execute immediate v_sql into v_id;     end;   ●静的SQL ・・・【 エラーになる 】     declare      variable v_id varchar2(3);     begin      select id into :v_id from test'     end; どんな事でもかまいませんので回答よろしくお願いします

  • SQL における変数の宣言と代入の仕方

    SQL における変数の宣言と代入の仕方 データベース言語でどの様なことが出来るものかと思い、postgreSQL を独りでいじり始めました。入力されたデータのチェックをきちんとしないといけないのだな、と思い、 --- CONSTRAINT rangeMin check (policyMin in (-3,-2,-1,0,1,2,3,4)), CONSTRAINT rangeMax check (policyMax in (-3,-2,-1,0,1,2,3,4)), --- と記述したのですが、「-3 から 4」という部分を重複して記述するのを避けたいので、 変数を宣言するなり何なりして何とかしたいのですが、 "SQL assign" やら "SQL variable" といったキーワードで色々検索しても、どうしても有用な情報に行き当たりませんでした。なにかしらのヒントを頂ければ幸いです。 宜しくお願いいたします。

  • 動的SQLのCOUNTのとり方

    動的SQLで、DBの件数を取得したいのですが、 うまく取得できず困っています。 教えてください! 以下の様に、記述しているのですが取り方間違っていますか? EXEC SQL EXECUTE statment INTO :CNTNUM; PREPEAした、statmentには SELECT COUNT(*) FROM テーブル名 where kbn = 3; と、ごくごく普通のSELECT COUNT文です。 cnt_numは、int型のホスト変数で宣言しています。 デバックしながら実行すると、cnt_numの値は初期化した時の 0のままです。実際取得した件数が0件なのかもと思い 初期化時に3を代入して実行したら、やはり値は3でした。 なので、件数が取得出来ていないようです。 オラクルエラーにもならず、次の処理へ流れていってしまいます。 知っている方、教えてください。

  • パスワードをsqlスクリプトで変更する

    agusupです。 SQLServerパスワードをsqlスクリプトで変更する方法を教えてください。 :::::::::::::::::::::::::以下sqlスクリプトで記述します。 USE [common] GO /****** 変数の宣言    ******/ declare @PASSWORD as char(25) /****** テーブルのパスワードを変数に取込む ******/ SELECT @PASSWORD = [password] FROM [common].[dbo].[users_pass] where [ID] = 'testuser' /****** testuserのパスワードを変数@PASSWORDに変更する ******/ ALTER LOGIN [testuser] WITH password = @PASSWORD GO 以上。 この内容でユーザのパスワードを変更できると思ったのですが、 ALTER LOGINを実行すると'@PASSWORD' 付近に不適切な構文があります。というエラーメッセージが発生します。 因みに以下の内容を実行すると正常終了します。 USE [master] GO ALTER LOGIN [testuser] WITH password = 'mylogin' GO これらのことからpassword = 変数@PASSWORDをどのようにしたら実行できるのか教授願います。 宜しくお願いします

  • PLSQLでのSQLの実行に関しての質問

    [環境] db:oracle 11g express edition os:windowsXP 言語:PLSQL [質問] PLSQLを使用したプログラムを作成していたのですが、SQLの文字数がVARCHAR2(32767)で宣言した変数の文字数を超えてしまいエラーとなります。 理由としては、引数で受け取った配列の数分だけUNIONでSQLを結合し、変数に格納しているのですが、配列の量が多いと変数の最大文字列を超えてしまうようです。(ソースイメージは下記に記述) 対応としては、変数を分割し、SQLを実行することや、SQLを組みなおすなどの対応が考えられるのですが、”(1)処理速度の都合上、できれば1度のSQLで実行したい。”、”(2)抽出条件が配列の条件によって、複雑に変わることと、既に稼働しているプログラムの為あまりソースを変更したくない”という理由から検索条件は変えずに、1度のSQLでどうにか実行できないかと考えています。 上記条件をクリアする何か良い方法はありますでしょうか? (もし、1回のSQLで実行は難しいのであれば、最悪配列を使用してSQLを分割して対応しようとは思っています。ただ、他に方法があるのであればそれに越したことはないです。) どなたか良い方法をご存知の方がおりましたら教えていただけないでしょうか? 宜しくお願い致します。 [ソースイメージ] <引数> 配列[100];          <-- 条件が格納された配列 <変数定義部> hensu_union VARCHAR2(32767); <-- 結合したSQLを格納 hensu_where VARCHAR2(1000); <-- SELECTの条件の格納 <プログラム部>  <省略>  .  .  .   FOR i IN 1..配列分 LOOP <-- 配列の数分、UNIONでSQLを結合 IF i > 1 THEN hensu_union := hensu_union || 'union '; END IF; hensu_union := hensu_union || 'select A,B,C .... from マスタA、マスタB WHERE ' || hensu_where ;  ←ここのUNIONで結合しすぎると最大文字列を超えエラー  END LOOP; . .  省略 . .   OPEN カーソル名 FOR hensu_union ; ←SQLを実行する部分でどうにか1回で済ませたい。                    VARCHAR2を超えるような文字列を格納できたり、                    他の良い方法はあるのか?

  • charで宣言した変数をstringへの代入で

    wchar_t cOrg[128]と宣言している変数にstringで宣言しているstrを cOrg[i] = str[i]; このように代入することはできたのですが、 char cAns[ 128 ]; このように宣言した変数の値をstrの41番目と42番目に 次のように入れようとするとエラーが出ます。 str[41]=cAns[1]; str[42]=cAns[2]; (エラー内容) \Form1.h(428): error C2664: 'System::String::String(wchar_t,int)' : 1 番目の引数を 'wchar_t [128]' から 'wchar_t' に変換できません。(新しい機能 ; ヘルプを参照) このような代入はできないのでしょうか? プログラムの詳細は下のようなものです。 wchar_t cOrg[128],*p; String^ str; String^ str2; int i; int iVal1,iVal2,iTotal = 0,iHosu; char cAns[ 128 ]; str = this->textBox1->Text; for(i=0;i<41;i++) { cOrg[i] = str[i]; } -------(中略)------------------------------------------ iHosu = ~iTotal; // 1の補数 iHosu++; // +1 iHosu = iHosu & 0x00FF; sprintf( cAns, "%s%02X%c", cOrg, iHosu, 0x22 ); str[41]=cAns[1]; str[42]=cAns[2];

  • SQLによって計算した変数を次のSQLに代入できますか?

    user(テーブル) id | name | bango 1 | taro | 1001 2 | sato | 1012 3 | miho | 1027 4 | hiro | 1066 *idはautoincrement、bangoはユニークの値 mark(テーブル) id | check | bango 1 | 0 | 1001 2 | 1 | 1001 3 | 1 | 1001 4 | 0 | 1012 5 | 0 | 1012 6 | 1 | 1027 7 | 1 | 1027 8 | 0 | 1066 *idはautoincrement、checkは1か0、bangoはユニークの値 checkが1の確立が高い順にnameを一覧表示したいのですが、 うまく2つのテーブルを繋げることができません。 queryによって計算した変数を次のqueryに代入することはできるのでしょうか? 具体的には以下のような感じです。 bangoが1001のcheck=1の確立を出す場合 //bangoが1001の数 $test1 = mysql_query("select count(id) from mark where bango='1001';",$conn $row1 = mysql_fetch_array($test1, MYSQL_ASSOC); $totalct1 = $row1["count(id)"]; //bangoが1001かつcheckが1の数 $test2 = mysql_query("select count(id) from mark where bango='1001' and check='1' ;",$conn) $row2 = mysql_fetch_array($test2, MYSQL_ASSOC); $totalct2 = $row2["count(id)"]; //bangoが1001かつcheckが1の確立 if($totalct2==0){ $kakuritu = '0' ; } else{ $kakuritu = $totalct2 / $totalct1 * 100 ; } 上記の変数を下記のように入れ込むことはできないのでしょうか? $test3 = mysql_query("select name from user order by $kakuritu ;",$conn)

    • ベストアンサー
    • MySQL
  • 変数代入の記述の仕方

    次のような場合、私はソースでは一行にあまり長くしたくないんです.理由は見づらくなるからです. $parameter=長い値(=値の部分1…値の部分n) $長い変数名(=変数名の部分1…変数名の部分n)=値 上の2パターンの場合できれば、 $parameter=値の部分1       …       値の部分n あるいは、 $parameter = 値の部分1  …  値の部分n のように適当に改行してソースコードを記述したいのですが、この場合、どのような書き方が許されるのでしょうか

    • ベストアンサー
    • PHP
  • Vbscriptで変数の宣言の仕方・・・こんなのできないのですか?

    Const AAA = 3 Dim gnHensuu(AAA) というような配列変数を使いたいのですが、 実行するとコンパイルエラー 整数型の定数がありませんと なってしまいます。 できないのでしょうか? VBscript Windows2000