我正在比较sql中where子句中的一些CHAR数据,如下所示:
其中PRI_CODE < PriCode
我遇到的问题是当CHAR值具有不同的长度时。因此,如果PRI_CODE = '0800‘和PriCode = '20’,则返回true而不是false。
看起来它是这样比较的
'08' < '20' 而不是like
'0800' < '20'是否从左侧开始进行CHAR比较,直到一个或另一个值结束?
如果是这样,我该如何解决这个问题呢?
我的值中可以包含字母,所以不能将其转换为数字。
发布于 2010-05-05 22:39:57
它不是将'08‘与'20’进行比较,而是像你所预期的那样,将'0800‘与'20’进行比较。
然而,您似乎没有预料到的是,'0800‘(字符串)确实小于'20’(字符串)。
如果将其转换为数字以进行数字比较是不可能的,则可以使用以下DB2函数:
right ('0000000000'||val,10)这将在左边给出大小为10的用零填充的val (例如,非常适合于CHAR(10) )。这将至少保证字段的大小相同,并且比较将适用于您的特定情况。但我强烈建议您重新考虑如何做事情:在性能方面,每行函数很少有很好的伸缩性。
如果您使用的是z/OS,您应该有几个DBA躺在计算机房的地板上等待工作-您可以向他们中的一个寻求更适合您的特定应用程序的建议:-)
在使用insert/update触发器和辅助列PRI_CODE_PADDED来保存完全填充的PRI_CODE列时,需要注意的一件事是(使用与上面相同的方法)。然后,在执行select ... where PR_CODE_PADDED < PriCode之前,确保您的PriCode变量的格式类似。
在插入/更新时产生的开销将在您可能执行的所有选择中分摊(因为它们不再使用每行函数,速度将快得令人眼花缭乱),从而为您提供更好的整体性能(当然,假设您的数据库不是那种写入多于读取的令人难以置信的罕见野兽)。
https://stackoverflow.com/questions/2774127
复制相似问题