mysql - 需要根据列的内容更改单个列中的很多值

标签 mysql

我有一个数据库,其中有一列完全包含引用播客音频文件的 URL。几乎所有它们的格式都是http://abcdefgh.abcd.ca/podcasting/audio/YYYYMMDD-HHMMSS-to-YYYMMDD-HHMMSS.mp3

问题是我们现在/audio/文件夹中有太多文件,以至于在 Windows 资源管理器中加载该文件夹需要很长时间。所以我们想按年份将它们全部移动到文件夹中 -> 例如 http://abcdefgh.abcd.ca/podcasting/audio/20060321-140000-to-20000321-150000.mp3 移动到http://abcdefgh.abcd.ca/podcasting/audio/2006/20060321-140000-to-20000321-150000.mp3 我们必须更新数据库中的所有网址以反射(reflect)新的文件夹结构。我们的文件从 2006 年到 2015 年都采用这种命名约定,并且在 2015 年 9 月左右我们进行了切换,以便所有新播客自动使用年份文件夹结构,不需要更新。

我对 SQL 相当缺乏经验 - 这是我工作的一部分,但在受聘时却“很高兴拥有它”。无论如何,我的尝试是这样的:

/*urls are in structure of = 'http://abcdefgh.abcd.ca/audio/YYYYMMDD-HHMMSS-to-YYYYMMDD-HHMMSS.mp3 but then some aren't in this format which we ignore. All urls are in the column of the table named "url"*/
UPDATE table.podcast_episodes
SET url = CASE 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2006____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2006/',substring(url FROM 42))
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2007____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2007/',substring(url FROM 42))
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2008____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2008/',substring(url FROM 42))
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2009____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2009/',substring(url FROM 42))
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2010____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2010/',substring(url FROM 42))
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2011____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2010/',substring(url FROM 42))
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2012____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2011/',substring(url FROM 42))
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2013____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2012/',substring(url FROM 42))
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2014____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2014/',substring(url FROM 42))
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2015____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2015/',substring(url FROM 42))
    /* do nothing */
    ELSE url= url
END

它的问题是它只是在匹配 case 语句时将 URL 字段设置为 0,或者在遇到“else”语句时将其设置为 1,这不是我想要的。

最佳答案

因为您没有正确使用 ELSE 或 CASE 语句。格式为

CASE WHEN url LIKE ... THEN (the concatenated value that you're setting url to).  

你不这样做

THEN url = (concatenated value you're creating)

因为它会像你看到的那样失败。如果你做了这样的轻微修改:

UPDATE podcast_episodes
SET url = CASE 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2006____-______-to-%.mp3' THEN concat(substring(url,1,41),'2006/',substring(url FROM 42))
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2007____-______-to-%.mp3' THEN concat(substring(url,1,41),'2007/',substring(url FROM 42))
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2008____-______-to-%.mp3' THEN concat(substring(url,1,41),'2008/',substring(url FROM 42))
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2009____-______-to-%.mp3' THEN concat(substring(url,1,41),'2009/',substring(url FROM 42))
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2010____-______-to-%.mp3' THEN concat(substring(url,1,41),'2010/',substring(url FROM 42))
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2011____-______-to-%.mp3' THEN concat(substring(url,1,41),'2010/',substring(url FROM 42))
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2012____-______-to-%.mp3' THEN concat(substring(url,1,41),'2011/',substring(url FROM 42))
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2013____-______-to-%.mp3' THEN concat(substring(url,1,41),'2012/',substring(url FROM 42))
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2014____-______-to-%.mp3' THEN concat(substring(url,1,41),'2014/',substring(url FROM 42))
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2015____-______-to-%.mp3' THEN concat(substring(url,1,41),'2015/',substring(url FROM 42))
/* do nothing */
ELSE url
END

然后它应该可以工作。 Here's a SQL fiddle to show the difference

关于mysql - 需要根据列的内容更改单个列中的很多值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37221218/

相关文章:

mysql - 存储/查询二进制序列和使用掩码搜索

mysql - 复杂的多对多 MySQL 表中的主键

mysql - phpMyAdmin 存储过程说明

php - 在同一个表中回显具有相同列名的多个值

php - 使用 DOMPDF 生成错误的 pdf

php - 向服务器添加大量记录

php - 如何使具有许多左连接的 mysql 查询执行得更快?

php - 在 Controller 中循环调用您自己的应用程序 api 是否明智?

php - 我正在寻找新的更新功能或建议来修复我现有的功能

mysql - LEFT JOIN 包含不存在的记录