2013-07-10 17 views
2

恐怕答案是直「不」,但我不知道是否有可能做一些事情,如在MySQL以下幾點:是否可以動態地選擇MYSQL中的列名是N個已知值中的一個的列名?

SELECT (title||label||name) FROM table

即選擇一列,可以被稱爲titlelabelname,從table

原因是:查詢將動態生成,其中table是已知的,但(由於我無法控制的原因),其他表中沒有一致的命名約定。

+0

你怎麼知道你想要哪個領域?或者你只是想選擇哪一個存在?可能這個幫助:http://stackoverflow.com/a/9086503 –

+0

我想選擇哪裏存在(如果存在多個,那麼第一個匹配),或者如果不存在,優雅地失敗。我想我可以做一個'DESCRIBE'並在PHP中檢查這種方式,但更喜歡單個查詢。 – HelloPablo

+1

如何生成查詢?你能做一個查詢表嗎?像'if(表==='書籍'){field ='title'}'? –

回答

1

它的確有用。

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='YOUR_TABLE_NAME' AND COLUMN_NAME IN ('name', 'label', 'title') into @colname; 
SET @table = 'YOUR_TABLE_NAME'; 
SET @query = CONCAT('SELECT ',@colname,' FROM ', @table); 

PREPARE stmt FROM @query; 
EXECUTE stmt; 

靈感在這裏:Dynamic conversion of string into column name. MySQL

+0

是的,它的確有訣竅!我選擇了邏輯上的改變,但會接受這個答案,因爲它回答了手頭的問題。謝謝。 – HelloPablo

2

@Strawberry's comment完全同意「這聽起來像是一場災難在製作」 —這是一個非常糟糕的設計策略,我強烈建議尋找一個替代的解決方案。然而,這是一個有趣的挑戰…這是我的解決方案:

SELECT COALESCE(title,label,name) col FROM `table` NATURAL LEFT JOIN (
    SELECT NULL title, NULL label, NULL name 
) t WHERE COALESCE(title,label,name) IS NOT NULL 

請參閱sqlfiddle

請注意,如果記錄數據是NULL,則不會返回任何記錄。

+0

我也同意 - 這是一個可怕的混亂!這是一個客戶的項目,我負責'修復'它。 * facepalm * – HelloPablo

+0

因此,它將它們選爲NULL,那麼如果碰巧存在,它會替換NULL值?整齊。 –

相關問題