質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

【MySQL】別カラムを一つのカラムで管理したい

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 7,509

star24star

score 115

+-----+-----+
|A_cd |B_cd |
+-----+-----+
|    1|   1 |
|    2|   1 |
|    3|   2 |
|    4|   1 |
|    5|   2 |
+-----+-----+

もしA_cdが
1なら"あ"
2なら"い"
3なら"う" ...

もしB_cdが
1なら"か"
2なら"き"

と言った管理を一つのカラム内で行いたいのですが可能でしょうか?

このような感じに…、

+-----+
|A_cd |
+-----+
||
||
||
||
||
||
||
||
||
||
|| 
| ... |
+-----+
SELECT
 CASE A_cd           -- A_cdの中では1~5までの数値を管理
  WHEN 1 THEN 'あ'
  WHEN 2 THEN 'い'
  WHEN 3 THEN 'う'
  WHEN 2 THEN 'え'
  WHEN 3 THEN 'お'
 END A_cd
 FROM
 table_name

 UNION

 SELECT
 CASE B_cd           -- A_cdの中では1~2までの数値を管理
  WHEN 1 THEN 'か'
  WHEN 2 THEN 'き'
 END A_cd
 FROM
 table_name

 GROUP BY
 id

A_cdB_cdtable_nameというテーブル内で管理している。
2つのカラムを一つにまとめたい

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

UNION ALLすれば一カラムに纏められます。

SELECT A_cd, [CASE WHENでの翻訳] FROM [table] WHERE A_cd IS NOT NULL
UNION ALL
SELECT B_cd, [CASE WHENでの翻訳] FROM [table] WHERE B_cd IS NOT NULL

※重複を省きたい場合はUNION ALLではなく、UNIONにしてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/07 15:53

    SELECT
    CASE A_cd
    WHEN 1 THEN 'あ'
    WHEN 2 THEN 'い'
    WHEN 3 THEN 'う'
    END A_cd
    FROM
    table_name

    UNION

    SELECT
    CASE B_cd
    WHEN 1 THEN 'え'
    WHEN 2 THEN 'お'
    END A_cd
    FROM
    table_name

    GROUP BY
    id

    のような感じにすると、縦で同じカラムに収まるのですが、


    +-----+
    |A_cd |
    +-----+
    | あ|
    | い|
    | う|
    | null|
    | null|
    | null|
    | え|
    | え|
    | お|
    +-----+

    といったように、"あ"、"い"、"う"にnullが入りつつ重複してしまうのです

    キャンセル

  • 2016/03/07 16:03 編集

    すみません。ちょっと訂正です。

    SELECT DISTINCT A_cd, [CASE WHENでの翻訳] FROM [table] WHERE A_cd IS NOT NULL
    UNION
    SELECT DISTINCT B_cd, [CASE WHENでの翻訳] FROM [table] WHERE B_cd IS NOT NULL

    あと、WHERE句が抜けているみたいなので、WHERE句もつけて下さい。

    キャンセル

  • 2016/03/07 16:20

    やはりnullが入ってしまいます。
    あ、うつし忘れてしまっていますが、ご指摘いただいたWHERE句も書いています

    キャンセル

0

質問を読み直したところ、質問の意図が違うことが分りました。
「A_cd、B_cdに別のマスタを結合(JOIN)し、それぞれ重複を排除(DISTINCT)して、
A_cd分とB_cd分を縦に並べる(UNION)する」でしたね。

SELECT DISTINCT -- Aパート 抽出結果を重複除外
        [Master_A].[A_Value] AS Val -- B側と同じ項目数、項目名にする
FROM [T_sample]
LEFT JOIN [Master_A] -- A_cdに対するマスタを結合
    ON [T_sample].[A_cd] = [Master_A].[A_cd]

UNION ALL
SELECT DISTINCT -- Bパート 抽出結果を重複除外
        [Master_B].[B_Value] AS Val -- A側と同じ項目数、項目名にする
FROM [T_sample]
LEFT JOIN [Master_B] -- B_cdに対するマスタを結合
    ON [T_sample].[B_cd] = [Master_B].[B_cd]

上記が、訂正版のSQL文です。
以上、ご参考になりますでしょうか?


以下、訂正前回答

「A_cdのマスタ、B_cdのマスタという2つのテーブルを結合する方法は?」
という質問でしょうか?

T_sample
+-----+-----+
|A_cd |B_cd |
+-----+-----+
|    1|   1 |
|    2|   1 |
|    3|   2 |
+-----+-----+
Master_A
+----+---
|A_cd|A_Value
+----+---
|1   |あ
|2   |い
|3   |う
Master_B
+----+---
|B_cd|B_Value
+----+---
|1   |え
|2   |お


の場合、下記のSQL文で、結合した状態を抽出できます。

SELECT
        [Master_A].[A_Value]
    ,   [Master_B].[B_Value]
FROM [T_sample]
LEFT JOIN [Master_A]
    ON [T_sample].[A_cd] = [Master_A].[A_cd]

LEFT JOIN [Master_B]
    ON [T_sample].[B_cd] = [Master_B].[B_cd]
;

その抽出結果は下記のようになります。

+--------+---
|A_Value |B_Value
+--------+---
|    あ  |   え
|    い  |   え
|    う  |   お

以上、
ご参考になりますでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/07 16:22 編集

    イメージとしてはそのような感じです。
    分かりづらい説明で申し訳ございません。。。、
    テーブルは一つで、その中で管理している2つのテーブルを一つのカラムに収めたいのです
    UNIONで一つのカラムにはおさまったのですが、A_cd、B_cdの2つが縦に並んだだけで重複してしまうのです。(重複部分にはnullが入る)

    キャンセル

  • 2016/03/07 18:52

    SELECT で表示する項目はコード以外にも複数あるということでしょうか?もしそうであれば質問文を修正していただければそれに合わせて回答文も編集します。ご検討ください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる