こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2010-10-13 02:15:43

QNo.6246434

暇なときに回答ください

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

投稿日時 - 2011-01-20 15:49:00

ANo.2

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

投稿日時 - 2010-10-18 19:19:56

ANo.1

PosgreSQLのバージョンを、Postgre 8.3といったレベルまで最低限、明記するようにしてください。

検査制約は、

check(式)

という構文ですから、

(policyMax between -3 and 4)

とか、


(policyMax>=-3 and policyMax<=4)

といった条件を指定すればいいのでは?

投稿日時 - 2010-10-14 23:38:15

補足

調べてみたところ、下記のとおりでした。
---
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',) )
---
お知恵を貸して頂ければ幸いです。
宜しくお願いいたします。

投稿日時 - 2010-10-15 21:48:29