【问题标题】:Best way to compare VARCHAR2 with CHAR将 VARCHAR2 与 CHAR 进行比较的最佳方法
【发布时间】:2014-04-15 11:58:52
【问题描述】:

我正在寻找比较 VARCHAR2(50 BYTE)CHAR(12 BYTE) 的最佳(和最快)方法。

有两个数据库,第一个包含一个带有CHAR列的table1(下划线表示空格字符填充CHAR长度)

ID  VALUE
1   123-45___
2   123-456__
3   123-457__

第二个数据库 (table2) 包含没有空格的 VARCHAR2。

ID  VALUE
4   123-45
5   123-456
6   123-457

所以,我想要这样的东西

SELECT table1.ID FROM table1 WHERE table1.VALUE = '123-45'

【问题讨论】:

  • value 列是否已编入索引?
  • 当然有索引,内容很不一样,有50000行
  • 你为什么要使用char?它绝对没有 varchar 的优势,但有几个严重的缺点
  • 你是对的,但这不是我的问题,因为我无法改变它。第一个数据库来自外部第三方。

标签: oracle char comparison varchar2


【解决方案1】:

由于table1.value 列已编入索引,因此您不想为了比较而对其进行操作,因为这会阻止索引被使用。所以你需要修改你正在查找的值:

SELECT table1.ID FROM table1 WHERE table1.VALUE = RPAD('123-45', 12)

Oracle 将使用您显示的查询隐式执行此操作,并且仍将使用索引。如果您要连接表,则相同,但在连接期间是否填充或修剪取决于驱动程序是哪个表:

SELECT table1.ID, table2.ID
FROM table1
JOIN table2 ON table2.value = RTRIM(table1.value)
WHERE table1.VALUE = RPAD('123-45', 12)

或者:

SELECT table1.ID
FROM table2
JOIN table1 ON table1.value = RPAD(table2.value, 12)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2021-12-28
    • 2017-12-25
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多