mysql 使用group_concat獲取select * 所有字段列名拼接


在使用數據庫查詢時,很多時候為了省事會使用select * from table ...方式處理,后續如果需要將* 號改成具體的列明時,對於字段特別多的表,如果通過手動一個一個寫的話效率會比較低,可以使用group_concat內置函數進行逗號拼接獲取*號對應的所有字段列名,如下所示:

查看表字段列:

desc order_info;

獲取拼接字段列:

-- 默認逗號分隔,其中table_schema為數據庫名,table_name為表名
select group_concat(COLUMN_NAME) as r from information_schema.columns where table_schema = "test" and table_name = "order_info";

如果表名需要別名的話,通過concat函數給列明加上即可:

-- 默認逗號分隔,加上別名前綴
select group_concat(concat("alia.", COLUMN_NAME)) as r from information_schema.columns where table_schema = "test" and table_name = "order_info";

如果想在逗號前加上一個空格的話可以設置分隔符:

-- 按制定分隔符分隔,逗號后加一個空格 
select group_concat(COLUMN_NAME SEPARATOR ", ") as r from information_schema.columns where table_schema = "test" and table_name = "order_info";

若果不需要一些字段的話可以再where條件里加上不想要的字段列:

-- 過濾不想要的字段 
select group_concat(COLUMN_NAME SEPARATOR ", ") as r from information_schema.columns where table_schema = "test" and table_name = "order_info" 
and COLUMN_NAME not in('create_date', 'pay_date');

以此方式便可很好地將*替換成左右字段名拼接效果

附:

存儲過程:

BEGIN
    -- SELECT tb;
    set @tb_o = tb;
    SELECT SPLIT_STR(@tb_o, " ", 1) INTO tb;
    -- SELECT tb;    
    set @sql = CONCAT('desc ', db, ".", tb);
    -- SELECT @sql;
   -- sql語句預處理
    PREPARE stmt from @sql;
   -- sql語句執行
    EXECUTE stmt;
    -- 要對一個預制語句解除分配,需使用DEALLOCATE PREPARE語句。嘗試在解除分配后執行一個預制語句會導致錯誤。
    deallocate PREPARE stmt;
   -- 調用分割函數
SELECT SPLIT_STR(@tb_o, " ", 2) INTO alias; -- SELECT alias; if(alias is not null and LENGTH(trim(alias)) > 0) then select CONCAT(alias,".") INTO alias; end if; -- SELECT alias; select group_concat(CONCAT(alias, COLUMN_NAME) SEPARATOR ", ") as r from information_schema.columns where table_schema = db and table_name = tb; END

分割函數:

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

使用:

# 若有別名則為表名+單空格+別名寫法
set @tb = "user a";
SELECT DATABASE() INTO @db;
call SQL_COLUMNS_APPEND(@db, @tb, "");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM