有没有办法为oracle db写一个Sqlalchemy查询(区分大小写),可以区分'ABCdef'和'abcd')。当前查询如下:
info = db.query(Table.name, Table.time_type,....)\
.outerjoin( Table1.name == Table2.t2_name)\
.......
任何机构都可以提出我在查询中缺少的内容吗?
干杯, 中号
答案 0 :(得分:0)
我听到你说在JOIN条款中,你想要' ABCdef' !=' abcd',还想要' ABCd' ==' abcd'。
后端优化器无法通过"查看"函数,例如lower()
,它将阻止利用某些索引。简而言之,"函数禁用索引"。
创建一个新的派生列,使用UPDATE在其中存储包含大小写的名称,并对其进行索引。然后做一个简单的等连接。
编辑:你修改了你的问题,说A.name == B.tag_name是感兴趣的等同连接,其中"等于"应该具有不区分大小写的语义。但查询优化器"无法通过" lower()函数 - 它将禁用任何索引。我们希望使用您的自定义相等性测试来支持高速连接,并且我们将使用一点磁盘空间来完成它。
更改表A以添加varchar列name1
。
同样改变表B以添加tag_name1
列。
这些是派生列,仅用于等连接条件。将案例破碎的数据放入其中:update A set name1 = lower(name);
类似于表B.您可以截断冗长的字符串或以其他方式处理数据以适应特定于应用程序的"相等"。
确保A的索引为name1
,B为tag_name1
。
现在,您的ON
条款只是要求name1 == tag_name1
。