アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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/s …
    • good
    • 0

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

    • good
    • 0

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



検査制約は、

check(式)

という構文ですから、

(policyMax between -3 and 4)

とか、


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

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

この回答への補足

調べてみたところ、下記のとおりでした。
---
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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す