2012-04-30 38 views
0

我想將整數轉換爲mySQL select查詢中的文本。這裏有一個表的樣子:mySQL將整數轉換爲SELECT查詢中的文本

Languages 
-------- 
1,2,3 

我想每個整數轉換成語言(例如,1 =>英語,2 =>法語等)

我一直在閱讀了上CONVERT和CAST函數在mySQL中,但他們似乎主要集中在將各種數據類型轉換爲整數。而且我也找不到任何處理我存儲數據的具體方式(多個數字在一個字段中)。

如何將整數轉換爲mySQL查詢中的文本?

UPDATE

這裏是我的MySQL查詢:

SELECT u.id, ulp.userid, ulp.languages, ll.id, ll.language_detail 
FROM users AS u 
JOIN user_language_profile AS ulp ON (ulp.userid = u.id) 
JOIN language_detail AS ll ON (ulp.languages = ll.id) 
+2

爲什麼不創建一個具有ID和名稱的語言表,然後選擇名稱? – gcochard

+0

謝謝,是這樣做的。它只會拉出該字段中的第一個值。 – chowwy

回答

5

二者必選其一:

  • MySQL的ELT() funtion:

    SELECT 
        ELT(Languages 
        , 'English' -- 1 
        , 'French' -- 2 
        -- etc. 
    ) 
    FROM table_name 
    
  • CASE表達:

    SELECT 
        CASE Languages 
        WHEN 1 THEN 'English' 
        WHEN 2 THEN 'French' 
        -- etc. 
        END 
    FROM table_name 
    

雖然,如果可能的話我會被誘惑要麼JOIN用查找表(如@ Mr.TAMER說)或改變的列的數據類型到ENUM('English','French',...)


UPDATE

從您的意見,現在看來,每個字段包含的語言集(甚至使用SET數據類型?),你想使用字符串替換數值?

首先,讀Bill Karwin's excellent answer爲「是否存儲數據庫列中的分隔列表真的很糟糕?」。

在這種情況下,我建議你規範化你的數據庫:創建一個新的語言實體表,其中每個記錄將現有表中的實體的PK與單一的語言相關聯。然後,您可以使用SELECT查詢(加入該新表格)和GROUP_CONCAT聚合來獲取所需的語言名稱列表。

沒有這樣的規範化,你唯一的選擇是做基於字符串的搜索&替換(這不會特別有效);例如:

SELECT CONCAT_WS(',', 
    IF(FIND_IN_SET('1', Languages), 'English', NULL), 
    IF(FIND_IN_SET('2', Languages), 'French' , NULL), 
    -- etc. 
) 
FROM table_name 
+0

您的代碼適用於該字段中的第一個條目,但不會拉第二個條目。有關我如何獲得這兩個值的任何想法?另外我不認爲我可以使用ENUM,因爲可以選擇多個值。最後,我嘗試了查找表,但它也只拉第一個值。 – chowwy

+0

@chowwy:我誤解了你的要求。請看我更新的答案。 – eggyal

+0

還可愛的答案! –

1

你爲什麼不做出一些語言表,當SELECT ING,獲得與您選擇的號碼相關聯的語言。

這是更好的如果你想添加一種新的語言。您只會將其插入表中,而不是更改代碼中的所有查詢,並且如果其他人正在使用您的代碼(他們不會很高興地調試和編輯所有查詢),也更容易。

+0

謝謝 - 我試過了;它只會拉出該字段中的第一個數字。 – chowwy

+1

我沒有真正理解,如果你把你的查詢(當然問題:))可能會更清楚。 –

+0

好的,我會添加它。 – chowwy

1

從你的其他意見,你是說語言字段是一個嵌入逗號的文字字符串?

從SQL的角度來看,這是一個非常不可行的設計。可變數量的語言應該存儲在另一個表中。然而,如果你堅持自己的觀點,你可能會構建一個正則表達式替換算法,但它看起來非常脆弱,我不會推薦它。如果您的語言超過9種,則以下內容將被打破,您需要使用Regexp UDF,這會帶來一些複雜性。

假設簡單情況:

SELECT REPLACE(
      REPLACE(
       REPLACE(Languages, '1', 'English'), 
       '2', 'French'), 
      N, DESCRIPTION) 

等。但我再說一遍:這是一個糟糕的數據設計。如果有可能,將其固定是這樣的:

person   person_lang   language 
==========  ============   ========= 
person_id -----< person_id 
...    lang_id  >----- lang_id 
             lang_desc 

然後我強烈建議你這樣做。

+0

似乎eggyal的答案已更新,而我寫這個.. – RET

+0

感謝你。我要更新我的數據庫設計。我贊成你的答案! – chowwy