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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

3回答

3729閲覧

SQLでjson状態でSELECTできませんか?

imuri

総合スコア4

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/06/10 20:46

編集2020/06/10 20:59

SQLでjson状態でSELECTできませんか?

イメージは以下です。

sql

1SELECT 2 u.id, 3 u.old, 4 '[{ja:n.ja},{en:n.en}]' AS names 5FROM users u 6 LEFT JOIN names n ON n.id=u.id 7WHERE u.old > 10

目的は以下です。namesを、取得結果を用いたjsonにしたい(「n.ja」を「佐藤」にしたい)のです。

idoldnames
220[{ja:佐藤},{en:Satou}]

テーブルは以下です。

sql

1CREATE TABLE users 2 (`id` int, `old` int, `name` varchar(6)) 3; 4INSERT INTO users 5 (`id`, `old`, `name`) 6VALUES 7 (1, 10, 1), 8 (2, 20, 2) 9; 10 11CREATE TABLE names 12 (`id` int, `ja` varchar(10), `en` varchar(10)) 13; 14 15INSERT INTO names 16 (`id`, `ja`, `en`) 17VALUES 18 (1, '佐藤', 'Satou'), 19 (2, '山田', 'Yamada') 20; 21

こうとか...うーん、PHPでやるしかないでしょうか。

sql

1SELECT 2 u.id, 3 u.old, 4 '[{ja:' . n.ja . '},{en:' . n.en . '}]' AS names 5FROM users u 6 LEFT JOIN names n ON n.id=u.id 7WHERE u.old > 10

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/10 21:56

DB サーバーは何か (SQL Server? MySQl? Oracle? その他?) ぐらいは書けませんか?
imuri

2020/06/10 22:05

Oracle以外ならどれでもいいですね
imuri

2020/06/10 22:06

最悪Oracleでもいいです、できますか?
imuri

2020/06/10 22:07

MySQLかSQLliteなら尚よしという感じです
退会済みユーザー

退会済みユーザー

2020/06/10 23:30 編集

SQL の書き方には DB によって方言のような違いがあることを認識してますか? 全部調べて書くなんてできないので、どれか一つあなたが使いそうなものを決められませんか?
退会済みユーザー

退会済みユーザー

2020/06/10 23:26 編集

あと、あなたが質問に書いた取得結果の names は JSON として正しい形式ではないですよ。そこも見直して、上で聞いた DB は何かと合わせて質問欄を編集して書き直してください。
sazi

2020/06/11 00:39

WHERE u.old > 10 という条件が必須なら結果的にinner joinのものしか抽出されないのでleft joinは無意味ですが、left joinにする意図は何でしょう?
guest

回答3

0

SQLServer(2017から?)とOracle(12cから?)にはselect結果をそのままJSONに変換する機能が備わっています。

[sqlserver] クエリの末尾にfor json pathなどをつけるだけ。
https://docs.microsoft.com/ja-jp/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server?view=sql-server-ver15

[oracle] select句内で関数を使って出力。"目的"のイメージに一番近い出力が可能かもしれない。
https://docs.oracle.com/cd/E82638_01/adjsn/generation.html#GUID-6C3441E8-4F02-4E95-969C-BBCA6BDBBD9A

投稿2020/06/10 22:55

編集2020/06/11 01:39
hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hope_mucci

2020/06/11 08:28

ご指摘感謝します。修正しました。
guest

0

mysqlで8.0以上ならJSON_OBJECTAGGが有効かもしれません

投稿2020/06/11 07:43

yambejp

総合スコア114775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

データベースで利用できる関数や演算子によりますが、基本的には文字連結で実現できると思います。
ただし、エスケープは考慮していません。

concat関数の場合

SQL

1SELECT 2 u.id, 3 u.old, 4 concat('[{ja:',n.ja,'},{en:',n.en,'}]') AS names 5FROM users u 6 LEFT JOIN names n ON n.id=u.id 7WHERE u.old > 10;

連結演算子が||の場合

SQL

1SELECT 2 u.id, 3 u.old, 4 '[{ja:'||n.ja||'},{en:'||n.en||'}]' AS names 5FROM users u 6 LEFT JOIN names n ON n.id=u.id 7WHERE u.old > 10;

連結演算子が+の場合

SQL

1SELECT 2 u.id, 3 u.old, 4 '[{ja:'+n.ja+'},{en:'+n.en+'}]' AS names 5FROM users u 6 LEFT JOIN names n ON n.id=u.id 7WHERE u.old > 10;

投稿2020/06/10 22:32

etsuhisa

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問