mysql - que - Incluir encabezados al usar SELECCIONAR EN PERFIL?
tags h1 y cursiva ejemplos (14)
¿Es posible incluir los encabezados de alguna manera cuando se usa MySQL INTO OUTFILE
?
Aquí hay una forma de obtener los títulos de cabecera de los nombres de columna de forma dinámica.
/* Change table_name and database_name */
SET @table_name = ''table_name'';
SET @table_schema = ''database_name'';
SET @default_group_concat_max_len = (SELECT @@group_concat_max_len);
/* Sets Group Concat Max Limit larger for tables with a lot of columns */
SET SESSION group_concat_max_len = 1000000;
SET @col_names = (
SELECT GROUP_CONCAT(QUOTE(`column_name`)) AS columns
FROM information_schema.columns
WHERE table_schema = @table_schema
AND table_name = @table_name);
SET @cols = CONCAT(''(SELECT '', @col_names, '')'');
SET @query = CONCAT(''(SELECT * FROM '', @table_schema, ''.'', @table_name,
'' INTO OUTFILE /'/tmp/your_csv_file.csv/'
FIELDS ENCLOSED BY /'///'/' TERMINATED BY /'/t/' ESCAPED BY /'/'
LINES TERMINATED BY /'/n/')'');
/* Concatenates column names to query */
SET @sql = CONCAT(@cols, '' UNION ALL '', @query);
/* Resets Group Contact Max Limit back to original value */
SET SESSION group_concat_max_len = @default_group_concat_max_len;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Creo que si usas un UNION funcionará:
select ''header 1'', ''header 2'', ...
union
select col1, col2, ... from ...
No sé de una manera de especificar los encabezados con la sintaxis INTO OUTFILE directamente.
Dado que la funcionalidad ''incluir encabezados'' aún no parece estar incorporada, y la mayoría de las "soluciones" aquí deben escribir los nombres de las columnas manualmente, y / o ni siquiera tomar en cuenta las uniones, recomendaría a superar el problema
La mejor alternativa que encontré hasta ahora es usar una herramienta decente (uso HeidiSQL ).
Haga su pedido, seleccione la cuadrícula, simplemente haga clic con el botón derecho y exporte a un archivo. Tiene todas las opciones necesarias para una exportación limpia, y debe manejar la mayoría de las necesidades.En la misma idea, el enfoque de user3037511 funciona bien y se puede automatizar fácilmente .
Simplemente inicie su solicitud con alguna línea de comando para obtener sus encabezados. Puede obtener los datos con un SELECT INTO OUTFILE ... o ejecutando su consulta sin límite, el suyo para elegir.Tenga en cuenta que la salida de redirigir a un archivo funciona como un amuleto tanto en Linux como en Windows.
Esto me hace querer resaltar que el 80% del tiempo, cuando quiero usar SELECT FROM INFILE o SELECT INTO OUTFILE, termino usando algo más debido a algunas limitaciones (aquí, la ausencia de ''opciones de encabezados'', en un AWS-RDS, los derechos perdidos, etc.)
Por lo tanto, no respondo exactamente a la pregunta de la operación ... pero debería responder a sus necesidades :)
EDITAR: y para responder realmente a su pregunta: no
A partir del 2017-09-07, simplemente no puede incluir encabezados si se queda con el comando SELECCIONAR EN SALIDA : |
De hecho, puedes hacer que funcione incluso con un ORDER BY.
Solo necesita algunos engaños en el orden por declaración: utilizamos una declaración de caso y reemplazamos el valor del encabezado con algún otro valor que garantice que primero se clasifique en la lista (obviamente, esto depende del tipo de campo y de si está ordenando ASC o DESC)
Supongamos que tiene tres campos, nombre (varchar), is_active (bool), date_something_happens (date), y desea ordenar los dos siguientes descendientes:
select
''name''
, ''is_active'' as is_active
, date_something_happens as ''date_something_happens''
union all
select name, is_active, date_something_happens
from
my_table
order by
(case is_active when ''is_active'' then 0 else is_active end) desc
, (case date when ''date'' then ''9999-12-30'' else date end) desc
Entonces, si todas las columnas en my_table
son un tipo de datos de caracteres , podemos combinar las respuestas principales (por Joe, matt y evilguc) juntas, para obtener el encabezado agregado automáticamente en una consulta SQL ''simple'', por ejemplo
select * from (
(select column_name
from information_schema.columns
where table_name = ''my_table''
and table_schema = ''my_schema''
order by ordinal_position)
union all
(select * // potentially complex SELECT statement with WHERE, ORDER BY, GROUP BY etc.
from my_table)) as tbl
into outfile ''/path/outfile''
fields terminated by '','' optionally enclosed by ''"'' escaped by ''//'
lines terminated by ''/n'';
donde las últimas dos líneas hacen que la salida csv.
Tenga en cuenta que esto puede ser lento si my_table
es muy grande.
Esta es una trampa alternativa si está familiarizado con Python o R, y su tabla puede caber en la memoria.
Importe la tabla SQL en Python o R y luego exporte desde allí como CSV y obtendrá los nombres de las columnas y los datos.
Así es como lo hago usando R, requiere la biblioteca RMySQL:
db <- dbConnect(MySQL(), user=''user'', password=''password'', dbname=''myschema'', host=''localhost'')
query <- dbSendQuery(db, "select * from mytable")
dataset <- fetch(query, n=-1)
write.csv(dataset, ''mytable_backup.csv'')
Es un poco una trampa, pero encontré que esta era una solución rápida cuando mi número de columnas era demasiado largo para usar el método concat anterior. Nota: R agregará una columna ''row.names'' al comienzo del CSV, por lo que querrá descartar eso si necesita confiar en el CSV para recrear la tabla.
Estaba escribiendo mi código en PHP, y tuve algunos problemas para usar las funciones concat y union, y tampoco usé variables de SQL, de ninguna manera lo hice funcionar, aquí está mi código:
//first I connected to the information_scheme DB
$headercon=mysqli_connect("localhost", "USERNAME", "PASSWORD", "information_schema");
//took the healders out in a string (I could not get the concat function to work, so I wrote a loop for it)
$headers = '''';
$sql = "SELECT column_name AS columns FROM `COLUMNS` WHERE table_schema = ''YOUR_DB_NAME'' AND table_name = ''YOUR_TABLE_NAME''";
$result = $headercon->query($sql);
while($row = $result->fetch_row())
{
$headers = $headers . "''" . $row[0] . "'', ";
}
$headers = substr("$headers", 0, -2);
// connect to the DB of interest
$con=mysqli_connect("localhost", "USERNAME", "PASSWORD", "YOUR_DB_NAME");
// export the results to csv
$sql4 = "SELECT $headers UNION SELECT * FROM YOUR_TABLE_NAME WHERE ... INTO OUTFILE ''/output.csv'' FIELDS TERMINATED BY '',''";
$result4 = $con->query($sql4);
Esto le permitirá tener columnas ordenadas y / o un límite
SELECT ''ColName1'', ''ColName2'', ''ColName3''
UNION ALL
SELECT * from (SELECT ColName1, ColName2, ColName3
FROM YourTable order by ColName1 limit 3) a
INTO OUTFILE ''/path/outfile'';
La solución proporcionada por Joe Steanelli funciona, pero hacer una lista de columnas es inconveniente cuando se trata de docenas o cientos de columnas. A continuación se detalla cómo obtener la lista de columnas de la tabla my_table en my_schema .
-- override GROUP_CONCAT limit of 1024 characters to avoid a truncated result
set session group_concat_max_len = 1000000;
select GROUP_CONCAT(CONCAT("''",COLUMN_NAME,"''"))
from INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ''my_table''
AND TABLE_SCHEMA = ''my_schema''
order BY ORDINAL_POSITION
Ahora puede copiar y pegar la fila resultante como primer enunciado en el método de Joe.
Para la selección compleja con ORDER BY uso lo siguiente:
SELECT * FROM (
SELECT ''Column name #1'', ''Column name #2'', ''Column name ##''
UNION ALL
(
// complex SELECT statement with WHERE, ORDER BY, GROUP BY etc.
)
) resulting_set
INTO OUTFILE ''/path/to/file'';
Puede usar una declaración preparada con la respuesta de lucek y exportar dinámicamente la tabla con el nombre de las columnas en CSV:
--If your table has too many columns
SET GLOBAL group_concat_max_len = 100000000;
--Prepared statement
SET @SQL = ( select CONCAT(''SELECT * INTO OUTFILE /'YOUR_PATH/' FIELDS TERMINATED BY /',/' OPTIONALLY ENCLOSED BY /'"/' ESCAPED BY /'/' LINES TERMINATED BY /'//n/' FROM (SELECT '', GROUP_CONCAT(CONCAT("''",COLUMN_NAME,"''")),'' UNION select * from YOUR_TABLE) as tmp'') from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''YOUR_TABLE'' AND TABLE_SCHEMA = ''YOUR_SCHEMA'' order BY ORDINAL_POSITION );
--Execute it
PREPARE stmt FROM @SQL;
EXECUTE stmt;
Gracias lucek.
Simplemente realizo 2 consultas, primero para obtener salida de consulta (límite 1) con nombres de columna (sin hardcode, sin problemas con Joins, Order by, nombres de columna personalizados, etc.), y segundo para hacer la consulta y combinar archivos en un CSV archivo:
CSVHEAD=`/usr/bin/mysql $CONNECTION_STRING -e "$QUERY limit 1;"|head -n1|xargs|sed -e "s/ /''/;''/g"`
echo "/'$CSVHEAD/'" > $TMP/head.txt
/usr/bin/mysql $CONNECTION_STRING -e "$QUERY into outfile ''${TMP}/data.txt'' fields terminated by '';'' optionally enclosed by ''/"'' escaped by '''' lines terminated by ''/r/n'';"
cat $TMP/head.txt $TMP/data.txt > $TMP/data.csv
Tendría que codificar esos encabezados usted mismo. Algo como:
SELECT ''ColName1'', ''ColName2'', ''ColName3''
UNION ALL
SELECT ColName1, ColName2, ColName3
FROM YourTable
INTO OUTFILE ''/path/outfile''
SELECT ''ColName1'', ''ColName2'', ''ColName3'' UNION ALL SELECT ColName1, ColName2, ColName3 FROM YourTable INTO OUTFILE ''c://datasheet.csv'' FIELDS TERMINATED BY '','' OPTIONALLY ENCLOSED BY ''"'' LINES TERMINATED BY ''/n''