0

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

该列包含诸如“15,20”之类的值;“30,15,50”(不按排序顺序)。并且只有 10 个不同的可能值

处理逻辑

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

我是 Mysql 脚本的新手。因此,如果您能提供一些有关如何解决此问题的指示,将会很有帮助

4

2 回答 2

1

警告

除了我确信这不是这样做的方法之外,还有一种方法。但是我不能足够强调数据库设计是一个问题,以及在 sql 中执行此逻辑的决定。这不应该。

请不要这样做。话说回来...

黑客攻击

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

  1. 拆分字符串
  2. 找到最高值
  3. 基于此进行查询。

第一个是最难的。例如,请参阅有关爆炸的问题字符串函数的 mysql 手册(尤其是注释)。可以做到,但是您需要做一些技巧,并利用您对字符串限制的知识(数量,它们的形成方式等),您可能可以SUBSTRING_INDEX像这些示例中那样做一些骇人听闻的事情。

如果您有单独的值,则可以比较它们以找到最高值。您也许可以使用 sqlMAX函数,但是当您进行所有 substring-split-explode 黑客攻击时,进行比较可能会更快。

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

讲道

数据库设计看起来有问题,但这可能是一个正当的理由。您可以更改的内容也可能受到限制(例如,它不是您的数据库),因此给定的就是给定的。悲伤但真实。

您需要在 sql 中执行此操作的事实,我很难做到这一点。应该有人有理由想要这个,而那个人可能是错的。你能去找这个人,找出原因吗?

于 2013-04-24T11:31:33.423 回答
0

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

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”有点像一个explode函数:它创建一个从列表中选择数字到表行中的SQL。如您所见,在上面的示例中,我输入了“40,50,10,20”,但您可以使用任意数量的项目和任何分隔符来代替“,”。
注释第二行“SET”并执行查询以查看究竟发生了什么。

下一个“SET @foo”扩展了查询,因此只会返回最大的数字(类似于“SELECT max([field])”,但由于查询的性质,我们不能在这里使用“max”) .
然后我们执行查询,因此它只返回列表中的最大数字。

如果你想用结果更新一个字段,你应该像这样扩展查询:
UPDATE myTable SET myField=[value from above @foo execution] WHERE [your clause]

我认为从这一点开始,您可以轻松弄清楚如何在特定情况下更新您想要的字段。
如果不是“一次性执行”来修复某些问题,您也可以将上述代码移动到一个函数中,但您稍后也需要此更新。

希望这可以帮助!

于 2013-04-24T13:18:14.273 回答