0

我想在 mySQL 选择查询中将整数转换为文本。这是一张桌子的样子:

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)
4

3 回答 3

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


更新

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

首先,阅读Bill Karwin对“在数据库列中存储分隔列表真的那么糟糕吗?”的出色回答。

在这种情况下,我建议您稍微规范化您的数据库:创建一个新的语言实体表,其中每条记录将现有表中实体的 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
于 2012-04-30T23:22:57.563 回答
1

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

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

于 2012-04-30T23:24:41.320 回答
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

那我强烈建议你这样做。

于 2012-04-30T23:54:27.127 回答