
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',) )
---
No.1ベストアンサー
- 回答日時:
タイトルが悪すぎると思いますけど。
「同じような制約を何度も定義する必要がある」ということ自体が、問題なのでは?
同じような定義をたくさん行う必要があるというなら、SQLの動的実行(SQLを文字列で組み立てて前処理(prepare)して実行(execute))をすればいいのでは?
その時に「星座名が必要」、「手作業でやったらタイプミスや重複して書き込むといった人員的なミスがある」といったことなら、事前に星座表(星座名で一意にしておく)を作っておいて、その検索結果をSQLの組み立てに利用(文字連結していく)すればいいと思いますよ。
そもそも、星座表を参照する参照制約にすれば、検査制約で星座名をだらだらと書く必要はないですけど。
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/s …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PostgreSQLで表結合+DELETEしたい
-
powergres(postgres)にalter文...
-
PostgreSQLで、元テーブルをコ...
-
動的に生成したカラムを使ったF...
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
エクセルグラフの凡例スペース
-
ACCESSで400以上のフィールドが...
-
Accessでテーブル名やクエリ名...
-
Accessファイルを作成者以外は...
-
Access テキスト型に対する指定...
-
「直需」の意味を教えてください
-
accessのレポートで元になるテ...
-
変数が選択リストにありません
-
Oracle 2つのDate型の値の差を...
-
INSERT INTO ステートメントに...
-
Accessでテーブルからテーブル...
-
Oracleのビュー作成時に「指定...
-
【Access】フォームで自動計算...
-
SUBSTRING 関数に渡した長さの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
列が存在しないと言われる
-
INSERTできるレコード数を制限...
-
PostgreSQLで表結合+DELETEしたい
-
長いSQL文を実行するには?
-
DBから日付順に指定件数の削除...
-
動的に生成したカラムを使ったF...
-
0の除算
-
■一番最初に値が入っている(Nul...
-
COPY時のtimestamp型について
-
alter tableすると、処理が止ま...
-
SQLで特定データがNULLなら別デ...
-
constraint と index の違い
-
SQLite:項目が存在しない場合の...
-
Oracleの制約構文に関して
-
INSERTできない
-
powergres(postgres)にalter文...
-
DB2でUNIQUE制約を削除したい
-
SQLiteに関数追加
-
DB2 「既存カラムへのnot null...
-
複数キーワードでのあいまい検索
おすすめ情報