首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql sql脚本

Mysql sql脚本
EN

Stack Overflow用户
提问于 2013-04-24 19:02:30
回答 2查看 372关注 0票数 0

我有一个表T,其中有几列,其中一列是逗号分隔值。我希望以以下方式处理此列并更新所有行

该列包含类似"15,20";"30,15,50“(未按排序)的值。并且只有10个不同的可能值

处理逻辑

根据分隔符(,)拆分列在结果列表中查找最大值。根据最大值,使用特定值更新该列。

我是Mysql脚本的新手。所以,如果你能给出一些如何解决这个问题的指针,那将是很有帮助的

EN

回答 2

Stack Overflow用户

发布于 2013-04-24 19:31:33

警告

除了我确信这不是做这件事的方法之外,还有一种方法。但我要强调的是,数据库设计是一个问题,在sql中执行此逻辑的决策也是一个问题。这不应该是。

请不要这样做。话虽如此...

黑客攻击

你需要这个,我想从你的问题中可以理解:

  1. 拆分字符串
  2. 根据该字符串查找最高值并执行查询。

第一个是最难的。例如,参见this question about explodingmysql manual for string functions (尤其是注释)。这是可以做到的,但你需要做一些技巧,并且利用你对字符串限制(数量,它们的形成方式等)的知识,你可能可以像这些例子中那样使用SUBSTRING_INDEX做一些黑客操作。

如果你有不同的值,你可以对它们进行比较以找到最高的值。您也许能够使用sql MAX函数,但是当您正在进行所有的子字符串-拆分-分解攻击时,进行比较可能会更快。

现在您有了一个值,您可以使用某种CASE语句对效果进行硬编码,或者在查询中输入它。

布道

数据库设计看起来是错误的,但这可能是一个合理的原因。您可以更改的内容也可能有限制(例如,它不是您的数据库),因此给定就是给定的。很悲哀但却是真的。

事实上,你需要用sql来做这件事,我在这方面遇到了困难。应该有人有理由想要这个,而有人可能是错的。你能去找这个人并找出原因吗?

票数 1
EN

Stack Overflow用户

发布于 2013-04-24 21:18:14

这里的这个人从列表中选择最大的数字(您可以从mySQL UI即时/查询窗口或命令行运行此代码进行测试):

代码语言:javascript
复制
SET @foo = CONCAT('SELECT ', REPLACE('40,50,10,20', ',', ' UNION ALL SELECT '));
SET @foo = CONCAT('SELECT * FROM (', @foo, ' ORDER BY 1 DESC) AS uncleFoo LIMIT 1');
PREPARE STMT FROM @foo; 
EXECUTE STMT;
DEALLOCATE PREPARE STMT;

所以。第一个"SET @foo“是一种分解函数:它创建一个SQL,将列表中的数字选择到表行中。在上面的例子中,我输入了"40,50,10,20“,正如你所看到的,但你可以使用任意数量的项目和任何分隔符来代替”,“。

注释第二个"SET“行并执行query,看看到底发生了什么。

下一个"SET @foo“扩展了查询,因此只返回最大的数字(类似于"SELECT max(field)”,但由于查询的性质,这里不能使用“max”)。

然后我们执行查询,这样它只返回列表中最大的数字。

如果要使用结果更新字段,则应扩展查询,如下所示:

代码语言:javascript
复制
UPDATE myTable SET myField=[value from above @foo execution] WHERE [your clause]

我认为从这一点开始,你可以很容易地弄清楚如何在你的特定情况下更新你想要的字段。

如果上面的代码不是“一次性执行”来修复某些东西,你也可以把上面的代码移到一个函数中,但你以后也需要这个更新。

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16190293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档