2012-04-30 36 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