2014-02-11 59 views
0

我想從任何表中選擇默認值。
我想要做方法從任何表中的所有默認值,使用自動生成的形式或等Mysql查詢將兩列轉換爲一行(選擇默認值)

因此,進出口創造了這個查詢:

SELECT `COLUMN_NAME`,`COLUMN_DEFAULT` FROM information_schema.`COLUMNS` WHERE `TABLE_SCHEMA`='databasename' AND `TABLE_NAME`='tablename' LIMIT 1 

結果是簡單

| SELECT | COLUMN_DEFAULT | 
+---------+----------------+ 
| id  | null   | 
| name | 'defname'  | 
| content | 'defcontent' | 

我需要將其轉換爲這樣的

| id | name | content | 
+------+---------+-----------+ 
| null | defname | decontent | 

謝謝。

+0

爲什麼你想這樣做嗎?您試圖解決的底層業務問題是什麼?聽起來像[XY問題](http://meta.stackexchange.com/a/66378)給我。 – eggyal

+0

沒有必要轉換什麼,只是使用一些像這樣的「SELECT id,name,content FROM databasename」或SELECT * ..一個簡單的查詢。 – SoldierCorp

+0

檢查此[選擇*變換行值作爲表列的名稱](http://stackoverflow.com/questions/14765765/select-transform-row-value-as-table-column-name) – Damodaran

回答

0

由於不同表的數字列可能有所不同,因此無法實現單個直接轉發的SQL語句。

我建議定義一個存儲過程來標識問題表中定義的列,並根據這些名稱和值生成數據透視表。

正在關注stored procedure可以幫助您做到這一點。

delimiter // 
drop procedure if exists default_values // 

create procedure default_values(in db varchar(255), in tbl varchar(255)) 
begin 
    declare c_name varchar(255) default ''; 
    declare all_names_read boolean default false; 

    declare c_names cursor for 
    select column_name from information_schema.columns 
     where table_schema=db and table_name=tbl; 
    declare continue handler for not found 
    -- declare continue handler for SQLSTATE '02000' 
    set all_names_read = true; 

    set @sql_query = '\nselect'; 
    set @rowNumber = 0; 

    open c_names; 
    repeat 
    fetch c_names into c_name; 

    set @sql_query = 
      concat(@sql_query, 
        if(all_names_read, '\n', if(@rowNumber < 1, '\n', ',\n')) 
       ); 

    if(! all_names_read) then 
     set @rowNumber = @rowNumber + 1; 

     set @sql_query = 
      concat(@sql_query, ' max(case column_name when \'', 
        c_name, '\' then column_default end) as \'', 
        c_name, '\''); 
    end if; 

    until all_names_read 
    end repeat; 

    close c_names; 

    set @sql_query = 
     concat(@sql_query, 
       'from information_schema.columns\n', 
       'where table_schema=? and table_name=?'); 
    set @db_name = db; 
    set @tbl_name = tbl; 

    prepare stmt from @sql_query; 
    execute stmt using @db_name, @tbl_name; 
    -- execute stmt; 
    deallocate prepare stmt; 
end; 
// 

delimiter ; 

以下是對定義的存儲過程的測試。

mysql> create table test.tide 
    -> (t timestamp, i int default 9, d date, e enum('yes', 'no') default 'no'); 

mysql> desc test.tide; 
+-------+------------------+------+-----+-------------------+------... 
| Field | Type    | Null | Key | Default   | Extra... 
+-------+------------------+------+-----+-------------------+------... 
| t  | timestamp  | NO |  | CURRENT_TIMESTAMP | on up... 
| i  | int(11)   | YES |  | 9     |   
| d  | date    | YES |  | NULL    |   
| e  | enum('yes','no') | YES |  | no    |   
+-------+------------------+------+-----+-------------------+------... 
4 rows in set (0.02 sec) 

mysql> call default_values('test', 'tide'); 
+-------------------+------+------+------+ 
| t     | i | d | e | 
+-------------------+------+------+------+ 
| CURRENT_TIMESTAMP | 9 | NULL | no | 
+-------------------+------+------+------+ 

上面的結果是通過存儲過程執行生成的查詢。
生成的查詢是這樣的:

mysql> select @sql_query\G 
*************************** 1. row *************************** 
@sql_query: 
select 
    max(case column_name when 't' then column_default end) as 't', 
    max(case column_name when 'i' then column_default end) as 'i', 
    max(case column_name when 'd' then column_default end) as 'd', 
    max(case column_name when 'e' then column_default end) as 'e' 
from information_schema.columns 
where table_schema=? and table_name=?