我想在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)
答案 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
然后我强烈建议您这样做。