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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Amazon RDS

Amazon RDSは、米アマゾン社が提供しているRDBMSサービス。クラウド上でのリレーショナルデータベースの構築および運用が可能です。MySQL/PostgreSQL/Oracle/SQL Serverのインストールを容易にすることができます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

855閲覧

シェルスクリプト/MYSQL selectしたidを格納し他のSQL文で使用したい

hunata_konbi

総合スコア2

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Amazon RDS

Amazon RDSは、米アマゾン社が提供しているRDBMSサービス。クラウド上でのリレーショナルデータベースの構築および運用が可能です。MySQL/PostgreSQL/Oracle/SQL Serverのインストールを容易にすることができます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2023/08/29 06:59

編集2023/08/29 07:33

実現したいこと

シェルスクリプトでDB①(MYSQL)からSELECTした値を配列にして、さらにDB②(MYSQL)のテーブルでその配列のidに部分一致する行をSELECTしたいです。

前提

シェルスクリプトで以下を実現したいのですが、SELECTしてきたidを配列にする方法、またその配列を使う方法がわからずご教示いただきたいです。

①select id from sampletable where selectid=21;の実行結果(id)を配列に格納
②別のSELECT分で配列のidに部分一致する行を抽出(こちらもわからずご教示いただきたいです)

該当のソースコード

shellscript

1#mysql.sh 2#!/bin/bash 3 4# ①SELCT結果を配列にする 5sql="select id from sampletable where selectid=21;" 6result=$(mysql -u${USER} -p${PASS} -D${DB} -h ${HOST} -e "${sql}") 7 8 9if [[ $? -eq 0 ]]; then 10 echo "${result}" | while read data 11 do 12 column=(`echo "$data"`) 13 echo "${column}" 14 done 15else 16 echo "db error." 17 exit 1 18fi 19 20# ②①の配列の値のidにカラム名mail_idが部分一致する行をSELECTで抽出 21 22select_sql="select * from dev_table where mail_id like "%${column}%"" 23result=$(mysql -u${USER2} -p${PASS2} -D${DB2} -h ${HOST2} -e "${select_sql}") 24

↓columnの中身(この結果を配列にしたい)

host@./mysql.sh id 1 3 4 5 6 7 8

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

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

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

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

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

logres_Fan

2023/08/29 09:16

DB①のSELECTとDB②のSELECTは、INNER JOINできないの?
guest

回答2

0

最終的にdev_tableの内容を取得するだけなら以下のSQLで良いのでは。

SQL

1select * from dev_table where mail_id in ( 2 select id from sampletable where selectid=21 3);

投稿2023/08/30 03:08

sazi

総合スコア25195

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

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

hunata_konbi

2023/08/31 08:46

ありがとうございます!
guest

0

ベストアンサー

最終目的が②(=①の結果のidにカラム名mail_idが部分一致する行をSELECTで抽出)であるならば
特に配列にこだわる必要はないように思われます。

echo "${result}" | while read data do column=(`echo "$data"`) echo "${column}" done

ここのdata→columnがなんだか冗長なことになっているので、そのままidとして扱うようにして

echo "${result}" | tail +2 | while read id do echo "----- id=${id} -----" select_sql="select * from dev_table where mail_id like '%${id}%'" echo "${select_sql}" #ここで${DB2}へのsql実行してもよい done

こんな感じに改造すれば目的達成できないでしょうか。
(tail +2 でヘッダ行を捨てています)

コメントに対しての回答追記

この$idを複数のSQLで活用したくif文の外で$idを使う方法

if文

ここでいうif文とは、if [[ $? -eq 0 ]]; then のことでしょうか?
であれば、そもそもif文の中でも外でも同じように使えます。

${DB2}に対するクエリをif文の中で全部処理してもいいですし、
単にネストが嫌ならばif文の1つ目のクエリ成功チェックを下記のように変更してその後の処理は普通に記述してもよいでしょう。

if [[ $? -ne 0 ]]; then echo "db error." exit 1 fi echo "${result}" | tail +2 | while read id do (以下略)

複数のSQLで活用

最終的な目標はなんでしょうか?
$idを複数のSQLで活用したい、というのが具体的に何をしたいのか見当つきませんでした。

「別のSELECT文で配列のidに部分一致する行を抽出」というのが、私が最初に提示したような方法では解決できなかったということでしょうか?

「出来たけど、さらに他のクエリでも使用したい」のであれば、 while文の do~done の間にさらに複数のクエリ実行を追加できます。
「ループでid 1件ずつ処理するではなく、まとめて1つにして複雑なクエリに含めたい」というのであれば、また別の手法を示します。
「1つ目のクエリで抽出されたidが多く、1件ずつはあまり現実的でない解法だった」という場合も、まとめて1つのクエリにすれば対応できます。

投稿2023/08/29 10:23

編集2023/08/30 03:08
pecmm

総合スコア406

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

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

hunata_konbi

2023/08/30 01:02

ありがとうございます。 この$idを複数のSQLで活用したくif文の外で$idを使う方法をご存じでしたらご教示いただきたいです。
otn

2023/08/30 02:22

> if文の外で$idを使う方法 パイプの中でセットしたシェル変数がパイプ外で参照できないと言うことを言っているのであれば、 パイプだとそれぞれ子プロセスで実行されるので親Bashプロセスの変数を更新できません。 解決策としては、パイプを使うのを止めて、リダイレクトにします。 while read ~~ done < <( echo "${result}" | tail +2 )
hunata_konbi

2023/08/31 08:47

ありがとうございます! パイプを使うのを止めて、リダイレクトで対応できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問