【问题标题】:SQL Concat_ws all columnsSQL Concat_ws 所有列
【发布时间】:2021-05-13 18:49:56
【问题描述】:

我必须 concat_ws 我表中的所有列。 我使用 sakila 架构。

我尝试将其用作子查询,但我无法将其放在主查询中的选择之后。

select column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='film'

如果这个查询发现 NULL 我必须返回“-”

select concat_ws(",",COALESCE(film.title,"-"),COALESCE(film.rental_rate,"-"),COALESCE(language.name,"-")) as dane 
from film 
inner join language 
    on film.language_id = language.language_id;

编辑对不起我的错我没有具体说明我的问题。 我想在第二个查询中获取数据,但在第二个查询中我只有 3 列,我需要创建查询以包含所有列。

【问题讨论】:

  • 你的问题是什么?还请提供样本数据和所需的输出
  • 编辑@eshirvana
  • 那么您必须一一提及所有列,或者使用动态 sql 准备查询(不是我的偏好)
  • 这能回答你的问题吗? MySQL concatenating all columns

标签: mysql sql mysql-workbench


【解决方案1】:

您可以使用 MySQL 创建它,并且必须像这样以 PREPARED 语句执行它:

SELECT
    CONCAT( "SELECT CONCAT_WS(',',"
    , GROUP_CONCAT( CONCAT("COALESCE( `",TABLE_NAME,'`.`',column_name,'`,"-")') 
      )
    , ") AS dane FROM `", @mySchema, '`.`', @tableName, '`' 
    , " INNER JOIN language on film.language_id = language.language_id")
    INTO @msql
FROM INFORMATION_SCHEMA.COLUMNS
JOIN ( SELECT @mySCHEMA:="Kazoku", @tableName:="film" ) as INIT
WHERE
    TABLE_NAME= @tableName
AND
    TABLE_SCHEMA= @mySchema
ORDER BY
    `ORDINAL_POSITION`;
    
    
SELECT @msql; -- only for debug output

PREPARE stmt FROM @msql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

样本

MariaDB [Kazoku]> SELECT
    -> CONCAT( "SELECT CONCAT_WS(',',"
    -> , GROUP_CONCAT( CONCAT("COALESCE( `",TABLE_NAME,'`.`',column_name,'`,"-")') 
    ->   )
    -> , ") AS dane FROM `", @mySchema, '`.`', @tableName, '`' 
    -> , " INNER JOIN language on film.language_id = language.language_id")
    -> INTO @msql
    -> FROM INFORMATION_SCHEMA.COLUMNS
    -> JOIN ( SELECT @mySCHEMA:="Kazoku", @tableName:="film" ) as INIT
    -> WHERE
    -> TABLE_NAME= @tableName
    -> AND
    -> TABLE_SCHEMA= @mySchema
    -> ORDER BY
    -> `ORDINAL_POSITION`;
Query OK, 1 row affected (0.07 sec)

MariaDB [Kazoku]> 
MariaDB [Kazoku]> 
MariaDB [Kazoku]> SELECT @msql; -- only for debug output
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| @msql                                                                                                                                                                                                             |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SELECT CONCAT_WS(',',COALESCE( `film`.`id`,"-"),COALESCE( `film`.`datetime`,"-"),COALESCE( `film`.`language_id`,"-")) AS dane FROM `Kazoku`.`film` INNER JOIN language on film.language_id = language.language_id |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [Kazoku]> 
MariaDB [Kazoku]> PREPARE stmt FROM @msql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

MariaDB [Kazoku]> 
MariaDB [Kazoku]> EXECUTE stmt;
+-------------------------+
| dane                    |
+-------------------------+
| 1,2021-01-01 00:00:00,1 |
+-------------------------+
1 row in set (0.00 sec)

MariaDB [Kazoku]> 
MariaDB [Kazoku]> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)

MariaDB [Kazoku]> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 2015-01-06
    • 1970-01-01
    • 2022-01-03
    • 2012-03-18
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多