2013-07-07 61 views
2

我有一個mySQL數據庫,我想知道如果我可以選擇列,而不是他們的名字,而是通過他們在表中的位置。
讓我們覺得我有以下的列的表(混合英語和法語數據):SQL根據列的位置進行選擇。可能嗎?

id 
en_name 
en_phone 
en_address 
fr_name 
fr_phone 
fr_address 

但是,這只是爲了演示目的,我真正的表有20個英文和法文20列。
是否可以在SELECT中選擇所有英文或法文欄而不列出其名稱?
如果這是不可能的,什麼是最佳實踐?

+2

沒有。 。 。 。 。 。 。 – gdoron

+0

我不知道你在做什麼 - 但你做錯了。 – Philipp

+0

我想擁有一個多語言網站,並且我想擁有兩種語言的記錄。 – Trix

回答

6

使用標準SQL,答案是否定的。沒有類似的構造:

select fr_* 

以獲得以fr_開頭的所有列。

您可以使用動態SQL(預準備語句)來生成所需的SQL。您可以使用視圖來僅選擇英文或法文欄。您可以存儲數據,以便列位於不同的行,並且您有一個語言標識符,用於選擇。在某些數據庫中,可以使用存儲過程僅返回所需的列。

但是,僅使用SQL查詢,您就沒有那種靈活性。

編輯:

您可以創建這樣一個觀點:

create view table_fr as 
    select id, fr_name, fr_phone, fr_address 
    from t; 

最好的做法,不過,將有存儲的語言作爲一個單獨列的表:

id 
Language 
Name 
Phone 
Address 

並將單個id的數據分成多行,每種語言一個。您可能需要另一個表,以獲取有關該ID的與語言無關的信息。

+0

謝謝!我知道我可以放置一個語言欄,並將每行存儲在兩行中,但不喜歡這樣做,因爲這會導致併發症。但我不明白其他解決方案,如使用視圖。請解釋。 – Trix

+0

非常感謝,但我沒有得到最後一點。 '分裂數據...'。你能否擺脫一些光線? – Trix

1

(這個答案最初由Mark Bannister寫的,但他刪除了它,我不知道爲什麼 - 這是很好的建議)

最好的做法是規範化表 - 這樣的結構會給出成爲:

id 
language 
name 
phone 
address 

然後,您可以通過運行查詢像得到值的列表特定語言:

select * from myTable 
where language = 'en'; 
+0

感謝您的答案Philipp,但將列拆分爲多行不稱爲標準化。規範你應該創建更多的表,而不是行。 – Trix