重新编码 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);
我正在处理一个名为 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);