题
我正在比较我的SQL中的某个子句中的一些char数据,
pri_code <pricode
我面临的问题是炭值的长度不同。因此,如果pri_code ='0800'和pricode ='20'它返回true而不是false。
看起来像是这样比较
'08' < '20'
而不是喜欢
'0800' < '20'
char比较是否从左开始到一个或另一个值结束?
如果是这样,我该如何解决?
我的值可以包含字母,因此转换为数字不是一个选择。
解决方案
它不是将“ 08”与“ 20”进行比较,正如您所期望的那样,将“ 0800”与“ 20”进行比较。
但是,您似乎没有期望的是“ 0800”(字符串)是 确实 小于“ 20”(字符串)。
如果将其转换为数字以进行数字比较不可能,则可以使用以下DB2函数:
right ('0000000000'||val,10)
这会给你 val
在左侧填充零,大小为10(理想 CHAR(10)
, , 例如)。这至少可以保证字段的大小相同,并且比较将适用于您的特定情况。但是,我敦促您重新考虑自己的工作方式:每行功能很少在性能方面很好地扩展。
如果您使用的是Z/OS,则应该有几个DBA在计算机室的地板上等待工作 - 您可能可以向其中一个DBA询问其中的建议,以便为您的特定应用程序量身定制更多的建议:-)
使用插入/更新触发器和辅助列时想到的一件事 PRI_CODE_PADDED
持有 PRI_CODE
列完全填充(使用与上述相同的方法)。然后确保您的 PriCode
在执行之前,变量类似地格式化 select ... where PR_CODE_PADDED < PriCode
.
在插入/更新时间发生的成本会在您可能要做的所有选择中摊销它(因为他们不再使用每行功能,将持久快速),从而为您提供更好的整体性能(假设您的当然,数据库并不是那些非常罕见的野兽之一,当然,数据库是更多的野兽。