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

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',) )
---

A 回答 (2件)

タイトルが悪すぎると思いますけど。



「同じような制約を何度も定義する必要がある」ということ自体が、問題なのでは?

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

そもそも、星座表を参照する参照制約にすれば、検査制約で星座名をだらだらと書く必要はないですけど。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/12/30 17:37

ドメインを使うといいと思います。



ドメインというのは既存のデータ型に対して制約を加えて別の名前を付けたものです。

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/s …
    • good
    • 0

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

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