重新编码 MySQL 中的列值

Recode column values in MySQL

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

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

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

5,6 变为“5 - 6”

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

等等。

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

替换数据总是有风险的。 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

如果您必须在 table 中具有此值,一种方法是创建另一个文本类型的字段并使用表达式更新该字段。然后,如果您真的非常想删除原始数字字段。或者将字段转换为文本类型,以便它可以用字符串更新。

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

您可以在 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);