【问题标题】:Recode column values in MySQL在 MySQL 中重新编码列值
【发布时间】:2021-07-16 05:03:56
【问题描述】:

我正在处理一个名为 UCODE130 的列,其值介于 1-130 之间。我想用范围替换值。例如,我想用字符串“1 - 4”替换在该列中找到的任何 1、2、3 或 4。我不想只做一个 select 语句 - 我想实际更改数据库本身中的列。

我遇到的另一个问题是这些范围的大小都不同。我需要类似的东西:

1、2、3 或 4 变为“1 - 4”

5,6 变为“5 - 6”

7、8、9、10、11 或 12 变为“7 - 12”

等等。

我需要重新编码或“查找并替换”这些值才能使其正常工作。我的列中有超过 20,000 行,所以我希望有一种有效的方法来做到这一点。如果需要更多信息,请告诉我。谢谢!

【问题讨论】:

  • 我想实际更改数据库中的列。这听起来是个坏主意。
  • 如何确定尺寸?

标签: mysql sql sql-update case recode


【解决方案1】:

替换数据总是有风险的。 SELECT 查询中的计算可以生成相同的数据集。您还想用字符串替换数字值。如果字段是数字类型,则无法做到这一点。如果不是,则数字将被视为字母数字,而不是数字,即 12 将排在 2 之前。

在 Access 中,我将使用内部 Switch() 函数(参见下面的示例 SELECT 查询)或调用自定义 VBA 函数。但是,在 MySQL 中可以在 SQL 语句中使用 CASE 结构。

SELECT *, 
Switch(UCODE130 < 5, "1 - 4", UCODE130 < 7, "5 - 6", UCODE130 < 13, "7 - 12") AS NewVal 
FROM table

如果您必须在表中具有此值,一种方法是创建另一个文本类型的字段并使用表达式更新该字段。那么如果你真的,真的想删除原来的号码字段。或者将字段转换为文本类型,以便可以使用字符串进行更新。

如果字段是文本类型,MySQL 应该将字段值隐式转换为表达式中的数字。

【讨论】:

  • Mysql没有开关功能。
【解决方案2】:

您可以在UPDATE 语句中使用CASE 表达式定义大小:

UPDATE tablename
SET UCODE130 = CASE
  WHEN UCODE130 BETWEEN 1 AND 4 THEN '1 - 4'
  WHEN UCODE130 BETWEEN 5 AND 6 THEN '5 - 6'
  WHEN UCODE130 BETWEEN 7 AND 12 THEN '7 - 12'
END
WHERE UCODE130 BETWEEN 1 AND 12 

或:

UPDATE tablename
SET UCODE130 = CASE
  WHEN UCODE130 <= 4 THEN '1 - 4'
  WHEN UCODE130 <= 6 THEN '5 - 6'
  ELSE '7 - 12'
END
WHERE UCODE130 BETWEEN 1 AND 12

请注意,为此,列的数据类型必须是 VARCHAR
如果是INTEGER,先改变它的数据类型:

ALTER TABLE tablename MODIFY id VARCHAR(10);

【讨论】:

  • 当字段为 VARCHAR 类型时,BETWEEN 1 AND 4&lt;=4 会正常工作吗? 12 会落在 1 到 4 之间吗?
  • @June7 MySql 进行隐式转换:dev.mysql.com/doc/refman/8.0/en/type-conversion.html
  • Access 做同样的事情,但是,正如那篇文章所述,只有一些转换会隐式发生。 Access 中的 SQL 没有将表达式中的字段隐式转换为数字。不得不使用 Val() 之类的函数。 MySQL 有吗?
  • @June7 这个问题是关于 Mysql 而不是关于 Access。我之前评论的链接中的文档有许多隐式发生的转换示例,并且完全涵盖了 OP 的要求,因为 UCODE130 列中的所有字符串值都是存储为字符串的数字。
  • 是的,我知道并且我阅读了这篇文章。只是想确认 MySQL 会将文本字段视为数字并正确分配字符串。因为只有一个示例使用了一个字段并且在我看来它说比较不适用于字符串列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
相关资源
最近更新 更多