0

我正在像这样比较我的 sql 中 where 子句中的一些 CHAR 数据,

其中 PRI_CODE < PriCode

我遇到的问题是 CHAR 值的长度不同。因此,如果 PRI_CODE = '0800' 和 PriCode = '20' 它返回 true 而不是 false。

它看起来像这样比较它

'08' < '20' 

而不是喜欢

'0800' < '20'

CHAR 比较是否从左侧开始,直到一个或其他值结束?

如果是这样,我该如何解决?

我的值可以包含字母,因此不能转换为数字。

4

1 回答 1

4

它不是将“08”与“20”进行比较,而是如您所料,将“0800”与“20”进行比较。

但是,您似乎没有想到的是,'0800'(字符串)确实小于 '20'(字符串)。

如果将其转换为数字以进行数字比较是不可能的,那么您可以使用以下 DB2 函数:

right ('0000000000'||val,10)

这将使您val在左侧用零填充到 10 的大小(例如,非常适合 a CHAR(10))。这至少可以保证字段大小相同,并且比较适用于您的特定情况。但我敦促你重新考虑你是如何做事的:每行函数很少能很好地扩展,性能方面。

如果您使用的是 z/OS,那么您应该有几个 DBA 正躺在机房地板上等待工作 - 您可能可以向其中一位 DBA 寻求更适合您的特定应用程序的建议 :-)

PRI_CODE_PADDED在使用插入/更新触发器和辅助列来保持列完全填充时想到的一件事PRI_CODE(使用与上述相同的方法)。然后PriCode在执行select ... where PR_CODE_PADDED < PriCode.

在插入/更新时产生的成本将在您可能执行的所有选择中摊销(因为它们不再使用每行函数,所以速度会非常快),从而为您提供更好的整体性能(假设您的当然,数据库并不是那些写多于读的极其罕见的野兽之一)。

于 2010-05-05T14:39:56.950 回答