• ベストアンサー

カンマ区切りで格納するカラムって設計上ありでしょうか?

例えば、1,2,5,8,9,10 というような形でデータを格納するカラムをテーブルに作ろうと思っているのですが設計上ありでしょうか? 格納したあとは、それSELECTのIN(1,2,5,8,9,10)で 使用するのが主で、更新時のキーが別にあればOKという感じでしょうか? こういう場合に、このような設計をした事があるよ。いった例など教えていただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • coco1
  • ベストアンサー率25% (323/1260)
回答No.1

「設計上あり」とは、CSV入出力を考慮しての事でしょうか? データベースソフトでは、テキスト入出力をする場合に区切り文字をデフォルトの「,」以外にもタブとか任意の文字に設定できることが多いので、その意味では「あり」です。Mysql、firebird、ACCESS、桐いずれもOKです。 あと「更新時のキーが別に云々」のところもよく意味がわからないのですが... 学術的意味合いで「データベースとはかくあるべき」というのがあるのかどうかは知りませんが。

natsuyori
質問者

お礼

CSV入出力は全く考慮していません。といことは設計上なしかな・・やっぱし。 「更新時のキーが別に云々」というのは、 項目1 項目2   1  1,3,5,6 で項目2を更新する際に、where 項目1='1'で 更新するという事です。つまり項目2はWHERE句には 入らることはありません。SELECT 項目2 WHERE 項目1='1'の後に、 SELECT * FROM xxテーブル where ID IN ('1','3','5','6'); という使いかは良いでしょうか?という意味で質問させていただきました。最初からこう書いておけばよかったです。すみません。

その他の回答 (2)

回答No.3

> DBはMySQLで、バージョンは4でLinuxです。  MySQLはわかりません。が、 > IN('1','2','3')であれば文字列でも数値でも検索にマッチするでしょうか?  それはあり得ません。もし、'1,5,8'と、'1,4,3'というデータがあって、IN ('1')で検索に引っかかったなら、'123,456'というデータも検索に引っかかります。つまり、人間にとって、というよりCSVファイルとしては文字列中のカンマに「項目を分ける」という“意味”がありますが、データベース中の文字列フィールドに、そんな“意味”はない、あったら困るからです。 #INで文字列も検索できるという前提ですけど #というか、試してみたら「ダメだ」とわかるでしょう?  テーブル設計の一例。 主体 ID  その他データ -- ------- 1   なにか 2   これも 複数データ ID  F_主体   意味 -- ----- --- 1   1      1 2   1      2 3   2      1 4   2      3 -- 複数の行がでる SELECT * FROM 主体  LEFT JOIN 複数データ ON F_主体 = 主体.ID  WHERE 複数データ.意味 IN (1, 2) -- 数値の場合  WHERE 複数データ.意味 = '1'   OR 複数データ.意味 = '2' -- 文字列の場合 複数の行で返ってくるので、データベース外(または埋め込みプログラム)でCSV形式にするなりなんなりします。

回答No.2

列に '1,2,5,8,9,10' '3,5,7,9' '4,5,6,7,8' と格納し、SELECT文で SELECT * FROM table WHERE column IN (1, 2, 3) と検索したい、ということでしょうか? そういうことであれば、できません。  一部のデータベースでは列を配列にできるようですが、そのようなものであれば、あるいは可能かもしれません。が、それも列の定義を「数値」とした場合です。「数値」と「文字列」は比較できませんので、IN句で(というか、数値で文字列内を)検索することはできません。  それから、まずは使用している(あるいは予定の)RDBMSの名称とバージョン、プラットフォームを明記してください。

natsuyori
質問者

補足

DBはMySQLで、バージョンは4でLinuxです。IN('1','2','3')であれば文字列でも数値でも検索にマッチするでしょうか?

関連するQ&A

  • SELECTの検索速度と、DB設計

    DB設計で悩んでいます。 ・一つのテーブルにするとカラム数が100ぐらい。 ・格納するデータはテーブルを正規化するようなものではない。 この場合のSELECTでの検索速度ですが、たとえ取り出すカラムを指定していてもカラム数が多いと検索速度に影響がでるのでしょうか? 或いは、テーブルを小分けにして、取り出すデータに応じてテーブルを結合していく方が良いのでしょうか? という感じでカラム数が検索スピードに与える影響についてどなたかご教授いただけませんでしょうか。宜しくお願いします。

    • ベストアンサー
    • MySQL
  • どのテーブルのどのカラム???助けて下さい

    会社に入社したばかりなのですが、プログラミングをしています。 で質問なのですが データベースのselect文で ある名称を取ってこないといけないときに どこのテーブルとどこのテーブルのどのカラムとどのカラムが 等しいときの名称を取ってくる様なselect文が作成できません テーブル設計書のカラム名を見ただけではわかりません こういった場合はどうすればいいのでしょうか 設計書とかにどのカラムが等しいときとか どのテーブルのどの名称とか普通そういう資料があるのでしょうか select文の構文は判ってもテーブルの仕様みたいなのがわからないので 対応できません 全然わかりません。助けてください

  • 日付をカラム格納せずテーブルとして作成しても良い?

    SQLite3なんですが、日付データをカラムへ格納せず、日付毎にテーブル作成してデータを格納しているコードがあるのですが、これは一般的なやり方なのでしょうか? ・一般的なやり方 ・一般的なやり方ではない ・一般的なやり方ではないが、アプリ内容(仕様)によっては普通に起こりうる ■質問背景 ・日付はカラムへ格納するものとばかり思っていました ・ちょっとびっくりしたので、質問してみました

  • コラムの値からコラム・テーブルを検索

    プライマリキーが様々なテーブルで別の名前で利用されていると、テーブル同士の関連の全てが把握できずに困っています。以前にコラム名からテーブルを検索する方法を質問したのですが、私が扱っているデータベースでは、プライマリキーがシステムの別の場所で少しだけ異なる名前で利用されていることが多いので、その方法では把握できない関連が出てきます。 具体的には、EMPLOYEES__KEYというEMPLOYEESテーブルのプライマリキーがPERSONALIZE_EMPOYEESというテーブルでPSNLZ_EMP__KEYという名前で使われている状況を考えていただきたいと思います。PSNLZ_EMP__KEYのコラムのレコードは全てEMPLOYEES__KEY内のデータからとられているとします。 以前にselect TABLE_NAME from USER_TAB_COLUMNS where COLUMN_NAME = 'EMPLOYEES__KEY' というSQLで特定のコラムを使っているテーブルを全てリストアップできると教えていただいたのですが、今回のケースでは、同じような内容のコラムなのですが名前が異なるため上記のSQLでは検索できないテーブルがある場合、それをどうやってとってきたらよいのかということです。 コラムの値にtaro, jiro, hanakoなどのようにテーブルまたはシステム内でユニークな値が指定されている場合、コラムの値を指定し、「その値が使われているコラム・テーブルを列挙せよ」というような命令を与えればよいのだということまでは分かりますが、どのようにSQLを書けば良いか教えてください。

  • カラム情報(主キー、データ型、桁数等)を取得するには

    テーブルに格納されているカラム情報(カラム名、主キー、データ型、データの桁数)を取得したいと考えています。 主キー情報とそれに付随するカラム情報は現在下記のSQL文で取得しています。 SELECT C.TABLE_NAME , COL.COLUMN_NAME, C.CONSTRAINT_TYPE, COL2.DATA_TYPE, COL2.DATA_LENGTH FROM USER_CONSTRAINTS C, USER_CONS_COLUMNS COL, USER_TAB_COLUMNS COL2 WHERE C.TABLE_NAME = COL.TABLE_NAME AND C.CONSTRAINT_NAME = COL.CONSTRAINT_NAME AND C.TABLE_NAME = COL2.TABLE_NAME AND COL.COLUMN_NAME = COL2.COLUMN_NAME AND C.CONSTRAINT_TYPE = 'P' AND UPPER(C.TABLE_NAME) = UPPER('テーブル名') ORDER BY C.TABLE_NAME, COL.POSITION ここで、主キー以外のカラムに対しても同様にカラム情報を取得したいのですが、どのように取得すればよろしいでしょうか? ※カラム名、主キー有無、データ型、桁数 でカラム情報を取得できれば最も良いのですが、 主キー情報を除いた全体のカラム情報を取得する事ができれば、こちらの情報でも助かります 宜しくお願い致します。

  • 特定のカラムが更新されたときのみ、そのレコードを別テーブルへ格納するト

    特定のカラムが更新されたときのみ、そのレコードを別テーブルへ格納するトリガの作成方法を教えてください・ トリガ名:TEST_UPDATE テーブル名:MV_ORACLE_MV_TEST カラム名:ORAPRIME ORACHANGE ORANAME CHANGENAME 対象カラム:CHANGENAME 格納先テーブル:TRITEST_ORACLE_MV_TEST 作成トリガ: CREATE OR REPLACE TRIGGER TEST_UPDATE after update of CHANGENAME on MV_ORACLE_MV_TEST FOR EACH ROW begin INSERT INTO TRITEST_ORACLE_MV_TEST SELECT MV_ORACLE_MV_TEST.ORAPRIME , MV_ORACLE_MV_TEST.ORACHANGe , MV_ORACLE_MV_TEST.ORANAME , MV_ORACLE_MV_TEST.CHANGENAME FROM MV_ORACLE_MV_TEST where MV_ORACLE_MV_TEST.CHANGENAME = :new.CHANGENAME -- commit; commit; end / テーブルMV_ORACLE_MV_TESTのうち、CHANGENAMEカラムが変更(更新)されたレコードのみを、 TRITEST_ORACLE_MV_TESTテーブルに格納したいと思っております。 この時、他のカラムも一緒に格納することが必要でして、 (もしカラムに変更があった場合、そのカラムも変更する。変更されていない場合は元の値を格納する) そのトリガを上記のように書いたのですが、 コンパイルエラーが発生しました。 どの部分が誤っているのか、ご教授願えませんでしょうか

  • カンマ区切りの文字列を検索する

    「1,2,3,5,10…」のようにカンマ区切りになっている文字列が格納されているカラム(number)があり、その文字列に含まれている数字と検索用配列「1,2,3」と比較して存在すれば抽出するみたいなことがやりたいのですがよくわかりません。 カンマ区切りではなく単一の数字であれば select * from tests where number IN(1,2,3); みたいな感じでnumberがIN()のなかにあるかどうかで抽出できると思うのですが、この場合はどのようにすればよいのでしょうか。 ちょっと説明が下手でわかりづらいかと思いますがよろしくおねがいします。

    • ベストアンサー
    • MySQL
  • カラム情報取得方法

    テーブル内のカラム情報を取得するにはどのようなSQLを作ればよいのでしょうか? 欲しい情報は「カラム名・主キーかどうか・データ型・桁数・NULLを許容かどうか」の5つとなります。 SQL Server は2005と2008を使用していて、どちらでも扱えるSQLがあると助かります。 どうぞ宜しくお願いいたします。

  • ストアド内でカラム名一覧を取得

    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ストアド内でカラム名一覧を取得、カンマで繋げてひとつの変数にまとめたい。 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 現在開発でストアドを使用する機会があり、そこで不明点が発生し悩んでおります。 以下、現状と質問です。 ■SQL SERVER 2000 ■テーブル(※)のカラム名一覧を取得し、  カラム名をカンマで繋げてひとつの変数に格納したいと思っています。  ※先の処理でカラムを取得したいテーブルをSELECTしており、  対象のテーブル名を変数に代入しています。  カラム一覧を取得するにあたり、以下のようにカーソルで習得し、  FETCHでカラム名を変数に格納しようと考えていましたが、  「'対象テーブル名'」には変数がいれられないので、どうしようかと悩んでいます。  DECLARE CURS_test CURSOR FOR   SELECT name FROM dbo.syscolumns   WHERE id IN   (SELECT id FROM dbo.sysobjects WHERE name = '対象テーブル名')   ORDER BY id, colid;  「sp_executesql」を使用してselect文を流そうとしたのですが、  複数ある列名を取得して、上記で記載しましたように  カラム名をカンマで繋げてひとつの変数に格納する方法がわかりませんでした。  こういった場合、どのように考えて、どのように書けばよいのでしょうか。  まだ触り始めたばかりで、わからないことがわかっていない部分もあり、  質問内容でわかりにくい部分がありましたらご指摘いただければと思います。  どうぞよろしくお願いいたします。

  • テーブル名をカラムとして取得する方法

    テーブル名をカラムとして取得する方法はありますでしょうか? オラクル8とVB6でプログラムを組んでいます。 例 TABLE Aの内容 カラム1 1 2 3 TABLE B カラム1の内容 4 5 6 SQLは簡略化してかきます。下記のSQLを実行した場合、 select A.カラム1 from A union select b.カラム1 from b 1 2 3 4 5 6 を取得できます。 例えば、上記で、SQL実行後、 下記のような値を取得したいです。 1 ,Aのテーブルだよ 2 ,Aのテーブルだよ 3 ,Aのテーブルだよ 4 ,Bのテーブルだよ 5 ,Bのテーブルだよ 6 ,Bのテーブルだよ それぞれのテーブルの名前を別名で結果に格納したいのです。 何か方法はありますでしょうか? なければ、unionせずに、2回SQLを発行し、それぞれに、 プログラム上で、「Aのテーブルだよ」を後で挿入したいと思っています。