我的查询检查表中是否有列出的任何值:
SELECT c FROM t WHERE RTRIM(c) IN ('string1', 'string2', ... 'stringN')列c的类型是CHAR,在将值与枚举值进行比较时,似乎需要使用RTRIM()来消除填充。
但是,我尝试在没有RTRIM()的情况下运行查询,它返回了完全相同的结果--尽管c中的所有值都小于最大宽度。
此外,如果我用右边空格填充枚举字符串,结果仍然是一样的。也就是说,'MEOW '是在('MEOW')中,也在('MEOW ')中。
这似乎很奇怪--是这样的事情应该如何运作,还是我们不应该依赖它?我们现在还在使用Oracle-11,这是标准的行为,还是将来会改变呢?
对我们来说,重要的不仅仅是因为stethics,还因为我们想在列上添加一个索引--并且避免使用"functional“(函数是RTRIM())。
发布于 2020-05-19 18:48:58
比较char()列的规则通常指定将值填充到较长的列的长度中。
因此,比较字符串末尾的空格是可选的。
我是记录在案
对于空白填充语义,如果这两个值有不同的长度,那么Oracle首先将空白添加到较短的值的末尾,这样它们的长度是相等的。。。。如果两个值没有不同的字符,那么它们被认为是相等的。此规则意味着,如果两个值仅在尾随空格数上不同,则它们是相等的。Oracle只在比较中的两个值都是CHAR、NCHAR、数据类型的表达式时才使用空白填充比较语义。。。
https://stackoverflow.com/questions/61898488
复制相似问题