如何在更新时强制转换varchar?

ncgqoxb0  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(306)

当我更新t1时 "VALUE" 字段应递增,但此字段设置为 VARCHAR 我会把它扔给 INTEGER :

UPDATE t1 SET "VALUE"="VALUE"+1 
WHERE NOT EXISTS (
  SELECT "VALUE" FROM t1 WHERE CAST(t1."VALUE" as INTEGER) = t2."VALUE");
py49o6xq

py49o6xq1#

你需要投 "VALUE" 一个整数来增加它,所以:

UPDATE t1 SET "VALUE" = CAST("VALUE" as INTEGER) + 1

firebird将自动转换 INTEGER 回到a VARCHAR 在任务中。
看这把小提琴。
也就是说,正确的处理方法是更改模式并使用 INTEGER 为此列键入。

zysjyyx4

zysjyyx42#

你已经开始打字了 WHERE CAST(t1."VALUE" as INTEGER) -那是你必须做的。

UPDATE t1 SET VALUE = CAST(CAST(VALUE as INTEGER) + 1 AS VarChar(10))

就像马克上面说的。
让我讨厌的是你的 WHERE 条款。 WHERE NOT EXISTS 在interbase/firebird上,在琐碎的数据卷上可能会非常慢。早在1990年代的interbase 5.6天,我就用这样一个constrct来计算传销树的自下而上。我认为它是有利的,因为不涉及未知的深度递归,因为如果树被拆分,并且不能从一个根访问所有的树-对于bototm up ascend来说,它没有问题。
结果,仅仅6万排就花了2个小时。老板们习惯于数周来用铅笔和纸计算,他们没有发现任何问题。但我知道有些东西很糟糕(它是-忽略索引和使用嵌套自然扫描,o(n^2)缩放)。
使用时要三思而后行 WHERE NOT EXIST ,在某些模式和数据上,这可能是好的,甚至是最好的方法,在另一些模式和数据上,它可能会迅速升级到实际上不可用的程序。每日wtf定期写一些程序,这些程序在开发过程中在小数据集上运行良好,但在部署到生产环境几个月后就停止了工作。当然,我的第一个sql程序正是那种类型的。。。
另外,您的查询似乎完全失败了。是什么 t2.VALUE ? 当使用等式表达式时,必须给出一个单例标量值。但是t2.value只是一列,它可以有零行或千行。
这个 WHERE 子句似乎刚刚被打破,我相信是你编的,从来没有在服务器上运行过。你真正的疑问是什么?现在你的查询看起来像

IF there is somewhere a row in T1, where value is same as (T2-VALUE constant???)
   THEN do nothing
   ELSE update every row in T1 by incrementing VALUE column

还是你的意图不同?

IF there are any rows in T1 and T2 with the same value in their VALUE columns
   THEN do nothing
   ELSE update every row in T1 by incrementing VALUE column

在这两种情况下,这都是一个一次性检查,必须在更新序列之前执行一次,而是让它在t1行上一次又一次地运行。这正是一个配方,使非缩放应用程序。
把计算不变量的代价从循环中去掉。
作为一般建议,要避免多次 WHERE NOT EXISTS 你至少有两个足够通用的工具。
使用控制反转。生成psql块(存储过程或匿名 EXECUTE BLOCK )与 for select ... do ... 循环。
照常 LEFT JOINIS NULL 检查,因为 WHERE NOT EXIST 替代品。在循环内部,只对那些必须更新的行调用update。
使用 MERGE 命令,而不是fo psql循环。
但最有可能的是,您的查询与您手头的实际任务几乎毫无关系。所以我们也不能提出任何合理的建议。

相关问题