19

次のようなことをする方法はありますか?これは機能しませんが、私がやりたいことを示しています

SET @OutputPath = '/Users/jo/Documents'
SET @fullOutputPath = CONCAT(@OutputPath,'/','filename.csv')
SET @fullOutputPath2 = CONCAT(@OutputPath,'/','filename2.csv')

SELECT * INTO OUTFILE @fullOutputPath
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
FROM database.tableName;

SELECT * INTO OUTFILE @fullOutputPath2
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
FROM database.tableName2;
4

4 に答える 4

30

編集:変数を使用せずにデータ(テーブルなど)をファイルに保存する(定数値のみ)

-- folder_path could could be like => c:/users/sami
-- choose the directory/folder already available in system
-- and make sure you have access to write the file there

SELECT * INTO OUTFILE 'folder_path/filename.csv'
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
FROM database.tableName;

変数を使用するようになりまし

SQLで変数名を使用する必要があるときはいつでも、動的SQLが必要です(これはストアドプロシージャにのみ適用され、単純なSQLクエリでもトリガーや関数でも適用されません)

SET @OutputPath := 'Users/jo/Documents'; //or any folder_path
SET @fullOutputPath := CONCAT(@OutputPath,'/','filename.csv');
SET @fullOutputPath2 := CONCAT(@OutputPath,'/','filename2.csv');

set @q1 := concat("SELECT * INTO OUTFILE ",@fullOutputPath,
" FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '\"'
FROM database.tableName");

set @q2 := concat("SELECT * INTO OUTFILE ",@fullOutputPath2,
" FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '\"'
FROM database.tableName2");

prepare s1 from @q1;
execute s1;deallocate prepare s1;

prepare s1 from @q2;
execute s1;deallocate prepare s1;

'との両方が既にクエリに含まれているため、 \ を"使用してクエリを連結し、元の文字をエスケープして、リテラル文字として使用し、連結には使用しないようにしました。""

variableSQLでの使用について説明しました。最初に、クエリが上の例のように機能するかどうかを確認する必要があります(変数を使用せずに)

結論:上記のクエリが正常に機能する場合、ストアドプロシージャで使用していることを考えると、私の言った動的SQLも同様に機能します。

于 2012-11-25T08:21:33.300 に答える
2

これを bash から行う場合、つまり mysql から csv 形式のデータを動的な名前のファイルにエクスポートする場合は、次のように簡単で読みやすいかもしれません。

bash 変数が埋め込まれた SQL:

where (e.timestamp >= ${begin_ts} and e.timestamp < ${end_ts}) order by ed.timestamp ASC ) a
INTO OUTFILE '${export_path}' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

そして、SQL ファイルを実行する bash スクリプト。SQL スクリプトを評価し、変数を置換する envsubst コマンドに注意してください。

#!/bin/bash
mysql_db="dbname"
mysql_user="mysqlpass"
mysql_pass="password"
export_path="./data.csv"
begin_ts="1478278490"
current_ts=$(date +%s -u)

sql=`export_path=${export_path} begin_ts=${last_ts} end_ts=${current_ts} envsubst < export.sql`
mysql $mysql_db -u $mysql_user -p$mysql_pass -e"${sql}"
于 2016-11-04T17:42:44.403 に答える
2

カルマが少ないので、Sami の投稿へのコメントとして回答を投稿します。ファイル名を引用符で囲む必要があります (@fullOutputPath の前後に ' を追加したことに注意してください)。

set @q1 := concat("SELECT * INTO OUTFILE '",@fullOutputPath,
"' FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '\"'
FROM database.tableName");
于 2013-10-15T08:57:27.700 に答える
-1

mysql CLI では実行できませんが、この方法で動作します

mysql -e "SELECT * FROM database.tableName;" -u user -p database > filename.csv
于 2012-11-25T04:08:53.820 に答える