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

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

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

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

5660閲覧

ユーザ定義変数に配列を代入したい

aglkjggg

総合スコア769

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2017/10/22 06:30

編集2017/10/22 07:12

###前提・実現したいこと
タイトルの通りですが、
ユーザー定義変数に配列(ベクトル)を代入したいのですが上手く出来ませんでした。

そもそも、スカラー値しか代入できないのでしょうか?

###発生している問題・エラーメッセージ
なし

###該当のソースコード
http://sqlfiddle.com/#!9/18c323/1

テーブル作成

sql

1CREATE TABLE `accounts` ( 2 `user_id` INT(11) NOT NULL AUTO_INCREMENT, 3 PRIMARY KEY (`user_id`) 4) 5COLLATE='utf8_general_ci' 6ENGINE=InnoDB; 7 8/* 1~10 */ 9INSERT INTO accounts(user_id) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
実行するクエリ

sql

1/* query1 */ 2select @user_ids := user_id from accounts order by user_id desc limit 3; 3 4/* query2 */ 5select @user_ids from dual;
query2 の実行結果

txt

18
欲しい query2 の実行結果

txt

110 29 38

###補足情報(言語/FW/ツール等のバージョンなど)

  • MariaDB 15.1

追記

一時テーブルを作成する事で欲しい結果を得る方法は分かります。
ユーザ定義変数の公式ドキュメントにも配列(ベクトル)についての記述が無かったので質問しました。
https://mariadb.com/kb/en/library/user-defined-variables/

sql

1drop table if exists tmp_user_ids; 2create temporary table tmp_user_ids(slelect user_id from accounts order by user_id desc limit 3); 3 4select user_id from tmp_user_ids;

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

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

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

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

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

guest

回答1

0

ベストアンサー

現在の仕様ではユーザー定義変数に配列や、結果が複数行となるような値を持たせることはできないものと思います。
下記のような形で文字列として結合する等での対応であれば可能かとは思います。

sql

1SET @user_ids = ''; 2 3SELECT 4 @user_ids := 5 CASE 6 WHEN @user_ids = '' 7 THEN user_id 8 ELSE CONCAT(@user_ids, ',', user_id) 9 END 10FROM accounts 11ORDER BY user_id DESC 12LIMIT 3; 13 14SELECT @user_ids FROM dual; 15 16+-----------+ 17| @user_ids | 18+-----------+ 19| 10,9,8 | 20+-----------+

sql

1SELECT 2 @user_ids := GROUP_CONCAT(user_id) 3FROM ( 4 SELECT user_id 5 FROM accounts 6 ORDER BY user_id DESC 7 LIMIT 3 8) t; 9 10SELECT @user_ids FROM dual; 11 12+-----------+ 13| @user_ids | 14+-----------+ 15| 10,9,8 | 16+-----------+

追記:

公式ドキュメントに「結果が複数行となるような値は代入できない」と明記されてはいませんが、

出来るとも書かれてない以上不可能なのですね。

MariaDBのドキュメントに記載があるかは見つけられていませんが、MySQLのリファレンスには下記の記載があります。
そのため、ユーザー定義変数では基本的に単一値のみを扱い、その値は基本的に文字列として取り扱われるものと思われます。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 9.4 ユーザー定義変数

ユーザー変数には、限定された一連のデータ型の値 (整数、小数、浮動小数点、バイナリ文字列、非バイナリ文字列、または NULL 値) を割り当てることができます。

10 進値と実数値の割り当てでは、値の精度やスケールは維持されません。
許可されている型以外の型の値は、許可されている型に変換されます。
たとえば、時間を表すデータ型や空間データ型の値は、バイナリ文字列に変換されます。

ユーザー変数に非バイナリ (文字) 文字列値を割り当てた場合、その変数には文字列と同じ文字セットと照合順序が含まれます。

ユーザー変数の強制性は暗黙的です。(これはテーブルカラム値と同等の強制性です。)

ユーザー変数に割り当てられたビット値は、バイナリ文字列として扱われます。

ビット値を数値としてユーザー変数に割り当てるには、CAST() または +0 を使用します。

結果セットでユーザー変数の値が選択された場合、それは文字列としてクライアントに返されます。

初期化されていない変数を参照する場合、その値は NULL で、型は文字列です。

投稿2017/10/26 22:08

編集2017/10/28 22:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aglkjggg

2017/10/28 16:24

ご回答がありがとうございます。 公式ドキュメントに「結果が複数行となるような値は代入できない」と明記されてはいませんが、 出来るとも書かれてない以上不可能なのですね。
退会済みユーザー

退会済みユーザー

2017/10/28 22:19

ご参考まで追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問