繁体   English   中英

MYSQL UPDATE 查询使用表达式

[英]MYSQL UPDATE Query using expression

我有一个表说table1与列id(INT), tag(VARCHAR),tag2(VARCHAR),var1(VARCHAR),var2(VARCHAR) 和 external_tags(TINY INT) 只有 id、tag 和 external_tags 字段中有数据。 我必须更新此表中的每一行,以便标记字段中的值应拆分为 tag2 和 var1 字段。 例如,有很多行,如

| 身份证 | 标签 | 标签2 | 变量 1 | external_tags |var2

| 1 | school_signup_xxx | 空 | 空 | 0 |空

| 2 | course_enroll_213 | 空 | 空 | 0 |空

| 3 | course_enroll_556 | 空 | 空 | 0 |空

| 4 | Automation_notify_bounced_111_222 | 空 | 空 | 0 |空

| 5 | Automation_notify_bounced_666_223 | 空 | 空 | 0 |空

| 6 | Automation_notify_bounced_426_253 | 空 | 空 | 0 |空

| 7 | registered_livestream_co_host_111_schedule_444 | 空 | 空 | 0 |空

| 8 | registered_livestream_co_host_632_schedule_234 | 空 | 空 | 0 |空

| 9 | 参加_recurring_live_class_868_rec_schedule_151 | 空 | 空 | 0 |空

| 10 | 参加_recurring_live_class_545_rec_schedule_747 | 空 | 空 | 0 |空

| 11 | manual_in | 空 | 空 | 1 |空

| 12 | 测试标签 | 空 | 空 | 1 |空

| 13 | 测试标签 abc | 空 | 空 | 1 |空

我想更新表 table1 中的上述行,如下所示

| 身份证 | 标签 | 标签2 | 变量 1 | external_tags |var2

| 1 | school_signup_xxx | school_signup | xxx | 0 |空

| 2 | course_enroll_213 | course_enroll | 第213话 0 |空

| 3 | course_enroll_556 | course_enroll | 第556话 0 |空

| 4 | Automation_notify_bounced_111_222| Automation_notify_bounced | 111 | 0 |222

| 5 | Automation_notify_bounced_666_223| Automation_notify_bounced | 第666话 0 |223

| 6 | Automation_notify_bounced_426_253| Automation_notify_bounced | 第426话 0 |253

| 7 | registered_livestream_co_host_111_schedule_444 | register_livestream_co_host | 111 | 0 |444

| 8 | registered_livestream_co_host_632_schedule_234 | register_livestream_co_host | 第632话 0 |234

| 9 | 参加_recurring_live_class_868_rec_schedule_151 | 参加_recurring_live_class | 第868话 0 |151

| 10 | 参加_recurring_live_class_545_rec_schedule_747 | 参加_recurring_live_class | 第545话 0 |747

| 11 | manual_in | manual_in | 空 | 1 |空

| 12 | 测试标签 | 测试标签 | 空 | 1 |NULL | 13 | 测试标签 abc | 测试标签 abc | 空 | 1 |NULL +----+-------------------+------+------+------- --------+---------------+------------------------ ---------------

有6个案例

  1. 如果 external_tags = 0 且 tag = school_signup_{var1value} 则将 tag2 更新为 school_signup 并将 var1 更新为 var1value
  2. 如果 external_tags = 0 且 tag = course_enrolled_{var1value} 则将 tag2 更新为 course_enrolled 并将 var1 更新为 var1value
  3. 如果 external_tags = 0 且 tag =automation_notify_bounced_{var1value}_{var2value} 则将 tag2 更新为automation_notify_bounced,将 var1 更新为 var1value 并将 var2 更新为 var2value
  4. 如果 external_tags = 0 且 tag =registered_livestream_co_host_{var1value}调度{var2value},则将 tag2 更新为registered_livestream_co_host,将 var1 更新为 var1value,将 var2 更新为 var2value
  5. 如果 external_tags = 0 且 tag = Attended_recurring_live_class_{var1value} rec_schedule {var2value} 然后将 tag2 更新为 attented_recurring_live_class 并将 var1 更新为 var1value 并将 var2 更新为 var2value
  6. 如果 external_tags = 1 则将 tag2 更新为标签值

如何使用 6 个更新查询更新上述案例?

请用MYSQL查询回复。

您可以将返回 6 行的查询加入到表中,每个不同的情况各 1 行,并使用MySql's string functions提取列tag的字符串片段,这将更新其他列:

UPDATE tablename t
INNER JOIN (
  SELECT 0 external_tags, 'school_signup' tag UNION ALL
  SELECT 0, 'course_enroll' UNION ALL
  SELECT 0, 'automation_notify_bounced' UNION ALL
  SELECT 0, 'registered_livestream_co_host' UNION ALL
  SELECT 0, 'attended_recurring_live_class' UNION ALL
  SELECT 1, NULL 
) e ON t.external_tags = e.external_tags AND (e.tag IS NULL OR INSTR(t.tag, CONCAT(e.tag, '_')) = 1)
SET t.tag2 = COALESCE(e.tag, t.tag),
    t.var1 = CASE 
               WHEN t.external_tags = 1 THEN t.var1
               ELSE SUBSTRING_INDEX(SUBSTR(t.tag, CHAR_LENGTH(e.tag) + 2), '_', 1)
             END,
    t.var2 = CASE 
               WHEN t.external_tags = 1 OR INSTR(SUBSTR(t.tag, CHAR_LENGTH(e.tag) + 2), '_') = 0 THEN t.var2
               ELSE SUBSTRING_INDEX(SUBSTR(t.tag, CHAR_LENGTH(e.tag) + 2), '_', -1)
             END

请参阅演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM