• 締切済み

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" といったキーワードで色々検索しても、どうしても有用な情報に行き当たりませんでした。なにかしらのヒントを頂ければ幸いです。 宜しくお願いいたします。

みんなの回答

  • gacky-79
  • ベストアンサー率100% (14/14)
回答No.3

変数宣言というよりは、重複した制約の宣言を避けるという観点ですが、2案あります。 1. 制約の条件を関数で宣言しておいて、その関数を CHECK 制約で使う方法 CREATE FUNCTION check_policy(integer) RETURNS bool AS 'SELECT $1 in (-3,-2,-1,0,1,2,3,4)' LANGUAGE sql IMMUTABLE STRICT; CONSTRAINT rangeMin check (check_policy(policyMin)) 2. 条件込みの DOMAIN (定義域) を作成し、rangeMin/Max の型に、この DOMAIN を使う方法 CREATE DOMAIN checked_integer AS integer CHECK (VALUE in (-3,-2,-1,0,1,2,3,4));

参考URL:
http://www.postgresql.jp/document/current/html/sql-createdomain.html
回答No.2

参照制約を使い、外部キーにすればいいのでは?

回答No.1

PosgreSQLのバージョンを、Postgre 8.3といったレベルまで最低限、明記するようにしてください。 検査制約は、 check(式) という構文ですから、 (policyMax between -3 and 4) とか、 (policyMax>=-3 and policyMax<=4) といった条件を指定すればいいのでは?

uemurm
質問者

補足

調べてみたところ、下記のとおりでした。 --- Welcome to psql 8.3.1 (server 8.1.11), the PostgreSQL interactive terminal. WARNING: You are connected to a server with major version 8.1, but your psql client is major version 8.3. Some backslash commands, --- 失礼致しました。 > (policyMax>=-3 and policyMax<=4) なるほど、確かにこちらの方が素直な書き方ですね。ありがとうございます。 因みに、下記の場合は如何でしょうか? --- CONSTRAINT myZodiac check ( myZodiac in ('Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces') ), CONSTRAINT yrZodiac check (yourZodiac in ('Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces', 'Air', 'Water', 'Fire', 'Earth',) ) --- お知恵を貸して頂ければ幸いです。 宜しくお願いいたします。

関連するQ&A

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

    SQL における変数の宣言と代入の仕方 PostgreSQL8.1 を使っております。尻に火がつき始めたので、同じような内容の投稿ですがどうかご容赦下さい。 下記のように記述したのですが、各星座の文字列を重複して記述するのを避けたいので、 変数を宣言するなり何なりして何とかしたいのですが、 "SQL assign" やら "SQL variable" といったキーワードで色々検索しても、どうしても有用な情報に行き当たりませんでした。なにかしらのヒントを頂ければ幸いです。 宜しくお願いいたします。 --- CONSTRAINT myZodiac check ( myZodiac in ('Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces') ), CONSTRAINT yrZodiac check (yourZodiac in ('Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces', 'Air', 'Water', 'Fire', 'Earth',) ) ---

  • カレントmdbをopenする宣言

    参照がDAOで、mdb内のテーブルのデータを変数に代入するために、 変数.Open "SQL内容" この文を使いたいのですが、この変数の宣言の記述は、 どう書いたら良いのか分かりません...

  • 変数の大きさを超える代入

    現在作っているプログラムで、一定時間ごとに変数に一定値が 加算され続けるような場所があります。 基本的にはint型の最大値を超えることはまずないのですが、 C言語やC++でたとえばint型で宣言した変数に対し、x++; のように一定周期ごとに記述して加算してゆき、最大値である、 +2147483647を超えた場合、xには何が代入されているんでしょうか。 -2147483648~+2147483647が範囲ですから、一周して、 最低値である-2147483648に加算されてゆくことになるのでしょうか? それとも、超えることが予想される場合、最大値を超えたら0にするなど 明示的に何らかの対処をしたほうがよいのでしょうか。 プログラム的には中身の数値に関してはあまり関係ないので、 その変数型の範囲で不可なく動作するなら問題ありません。 超えることが予想される場合、対処するべきなのか、 放っておいてもよいのかどうかを教えていただきたいです。

  • バインド変数について

    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; どんな事でもかまいませんので回答よろしくお願いします

  • VBScriptの変数宣言

    ASPでvbscriptを使って処理をしているページの修正を行っていたのですが、その中で不思議な状態が発生しています。 <% Option Explicit On Error Resume Next %> ===== 省略 ===== <% filename = Trim(bobj.Form(bin,"filename")) Dim filename ===== 省略 ===== 普通、上記のような記述ではfilenameの代入のところでエラーが発生すると思うのですが、代入処理の直後にerr.numberを判定しても、エラーが発生していないんです。 includeしてあるファイルの内部も検索しましたが、filenameの変数宣言は見つかりませんでした。 VBScriptって、どこで変数宣言を行っても有効になるのでしょうか? 正常に動いているので、今のところ問題は無いのですが、何か気持ち悪くて。。。 似たような現象が起こった事のある方や、これが正しい動きだというご指摘をお願いいたします。

  • public変数

    formA で dim test as New fromB test.m_foo = "分かりません" と値を代入し fromB で public変数 Public m_foo as string を宣言しています その他の formC, formD, formE で formBのpublic変数m_fooを使用したい場合  例 formC 上で宣言している変数 ANS に代入したい場合    formC に ANS = formB.m_foo と記述しても上手くいきません どのように記述したら  formB で宣言しているpublic変数を他のformでも使用できるのでしょうか?     

  • 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文が間違っているとデバッグプリントのところに行く前に構文エラーで落ちてしまう為、確認できません。 間違いを探したいからデバッグしているのに、どうすれば良いか分かりません。 何か記述した変数内容がどうなっているのか、確認する方法はないでしょうか? うまく説明ができず、分かりづらいかもしれませんが、ご回答いただければ幸いです。

  • 変数の宣言と使用について

    こんばんは。 数日前から、Javaのプログラミングの学習をしている者です。 とある書籍を読んで、インターネットで調べながら学習しております。 (オブジェクト指向は学習しておらず、三大制御構造まで学習済です。) まだまだ無知な身分であり恐縮ですが、もしよろしければご教授下さい。 ある程度検索しましたが、既に同一の解決済み質問がありましたらご容赦下さい。 当方は、Javaの前にCOBOLとC言語を学習しました。 それらの言語では、変数宣言は処理の最初にまとめて記述していました。 (COBOLはデータ部、C言語は関数内の最初) Javaのソースコードを参考にすると、処理(メソッドブロックなどのブロック内) の最初にまとめて記述しているのではなく 「一文で使用直前に宣言して、同時に初期化代入している」のをよく見掛けます。 Javaでは使用直前に宣言して使用するのがルールであり、 宣言をブロック内の最初にまとめて行っておくのは御法度でしょうか? (個人的にはC言語と同じように記述したいですが、Javaでは逆に 読みにくくなってしまうため、よろしくないという解釈で正しいですか?) 変な質問で大変申し訳ありませんが、ご回答頂けますと嬉しいです。 以上、よろしくお願い致します。

    • ベストアンサー
    • Java
  • SQLでの変数の扱いについて

    VBを利用してのSQL文に変数を使いたいのですが記述方法が良くわかりません。 まず dim a as string dim b as integer dim c as integer a="AAAA" b=10 c=23500 として テーブルZの項目1が nvarchar 項目2が tinyint 項目3がrealであった場合 sql文の記述方法をWebで探していると 文字列変数ならシングルクォーテーションでくくって代入 数値変数ならダイレクトに代入というようにとれるところがあったので下記の 様に記述すると更新されません sqlstr=("UPDATE テーブルZ set 項目1='a',項目2=b,項目3=c where 項目=1") 下記のように分割してそれぞれひとつづつのテストすると更新できます sqlstr=("UPDATE テーブルZ set 項目1=" & a & " where 項目=1") sqlstr=("UPDATE テーブルZ set 項目2='" & b & "' where 項目=1") sqlstr=("UPDATE テーブルZ set 項目2='" & c & "' where 項目=1") 上記の要領で1つにまとめると出来ないので,どのように書けばよいのでしょうか よろしくお願い致します

  • Cソースにホスト変数を宣言したヘッダをインクルード方法

    C言語ソースにホスト変数を宣言したヘッダをインクルードする記述を教えてください。下記の記述をしたのですが、エラーになります。 EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; #include "../host_header.h" EXEC SQL END DECLARE SECTION;