mySQL在SELECT查询中将整数转换为文本

时间:2012-04-30 23:20:43

标签: mysql

我想在mySQL select查询中将整数转换为文本。这是表格的样子:

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

我想将每个整数转换为一种语言(例如,1 =>英语,2 =>法语等)

我一直在阅读mySQL中的CONVERT和CAST函数,但它们似乎主要关注将各种数据类型转换为整数。而且我找不到任何与我存储数据的特定方式有关的事情(在一个字段中有多个数字)。

如何在mySQL查询中将整数转换为文本?

更新

这是我的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)

3 个答案:

答案 0 :(得分:5)

使用:

  • MySQL的ELT()功能:

    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使用查找表(如@TTTER所说)或将列的数据类型更改为ENUM('English','French',...)


<强>更新

从您的评论中,现在看来每个字段都包含一组(甚至可能使用SET数据类型?)语言,并且您想用字符串替换数值?

首先,请将Bill Karwin's excellent answer读取为“将分隔列表存储在数据库列中真的那么糟糕吗?”。

在这种情况下,我建议您对数据库进行规范化:创建一个新的语言实体表,其中每个记录将现有表中实体的PK与单个语言相关联。然后,您可以使用SELECT查询(加入该新表)和GROUP_CONCAT聚合来获取所需的语言名称列表。

如果没有这样的规范化,您唯一的选择就是进行基于字符串的搜索&amp;替换(效率不高);例如:

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

答案 1 :(得分:1)

为什么不制作数字语言表,并在SELECT时获取与您选择的那个号码相关联的语言。

如果您想添加新语言,这样会更好。您只会将其插入表中,而不是更改代码中的所有查询,如果其他人正在使用您的代码,也会更容易(他们不会很乐意调试和编辑所有查询)。

答案 2 :(得分:1)

根据您的其他评论,您是说语言字段是嵌入了逗号的文字字符串吗?

从SQL的角度来看,这是一个非常不可行的设计。可变数量的语言应该存储在另一个表中。

然而,如果你坚持使用你已经拥有的东西,你可能能够构建一个regexp替换算法,但它看起来非常脆弱,我不推荐它。如果您有超过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

然后我强烈建议您这样做。