我的查询检查表中是否存在任何列出的值:
SELECT c FROM t WHERE RTRIM(c) IN ('string1', 'string2', ... 'stringN')
列的类型 c
是 CHAR
,这似乎需要使用 RTRIM()
在将值与枚举值进行比较时,除去填充。
但是,我尝试在没有 RTRIM()
它返回了完全相同的结果——尽管 c
小于最大宽度。
而且,如果我在枚举字符串的右边加上空格,结果仍然是一样的。也就是说, 'MEOW '
在 ('MEOW')
以及在 ('MEOW ')
.
这似乎很奇怪——事情应该这样做,还是我们不应该依赖它?我们现在还在使用oracle-11,这是标准行为,还是将来会改变?
对我们来说重要的不仅仅是因为æstethics,但也因为我们想在列上添加一个索引--而且更希望避免使用“函数索引”( RTRIM()
是函数)。
1条答案
按热度按时间kx5bkwkv1#
比较规则
char()
列通常指定将值填充到较长值的长度。因此,比较字符串末尾的空格是可选的。
记录如下:
对于空白填充语义,如果两个值的长度不同,那么oracle首先将空白添加到较短值的末尾,以便它们的长度相等。如果两个值没有不同的字符,则认为它们相等。这条规则意味着如果两个值仅在尾随空格的数量上不同,则它们相等。只有当比较中的两个值都是数据类型char、nchar、。