如何在SQL中连接两个字符串列时忽略尾部斜杠

如何在SQL中连接两个字符串列时忽略尾部斜杠,sql,oracle,slash,trailing,Sql,Oracle,Slash,Trailing,我有两张桌子tableA和tableB,如下所述 desc tableA GUID PROPERTY_NAME PROPERY_VALUE ANOTHER_COL_1 ANTHER_COL_2 desc tableB GUID PROPERY_NAME PROPERTY_VALUE RANDOM_COL_1 RANDOME_COL_2 我有下面的查询来获取条目列表,这些条目具有与property_name匹配的值,这里是“URL” 这里的问题是,由于属性值是URL,它们可能有也可能没有尾部斜

我有两张桌子tableA和tableB,如下所述

desc tableA
GUID
PROPERTY_NAME
PROPERY_VALUE
ANOTHER_COL_1
ANTHER_COL_2

desc tableB
GUID
PROPERY_NAME
PROPERTY_VALUE
RANDOM_COL_1
RANDOME_COL_2
我有下面的查询来获取条目列表,这些条目具有与property_name匹配的值,这里是“URL”


这里的问题是,由于属性值是URL,它们可能有也可能没有尾部斜杠。我希望连接发生在不考虑尾部斜杠的情况下。请建议使用PL/SQL过程删除尾随斜杠来实现相同的效果的更好方法。

您可以使用RTRIM函数轻松删除尾随斜杠:

...
AND RTRIM(A.PROPERTY_VALUE,'/') = RTRIM(B.PROPERTY_VALUE,'/')
你有两个选择

首先是在使用前清理数据

在系统中存储任何URL之前,如有必要,请添加或删除斜杠(如首选)。以这种方式确保所有URL以相同的格式存储,以便于使用

第二个是在运行时清理数据

我不提倡这些选项,因为它们会产生不必要的开销,并会妨碍索引的最佳使用

RTRIM(A.PROPERTY_VALUE, '/') = RTRIM(B.PROPERTY_VALUE, '/')
最干净的代码,但可能会阻止索引的使用

  • 正在修改表A和表B中的值
  • 这可能需要扫描两个表
或者

  • (确保B.PROPERTY_值以“/”结尾,然后进行比较);或
  • (确保B.PROPERTY_值不以“/”结尾,然后进行比较)
如果这些条件中的任何一个为真,则URL匹配

A.PROPERTY_VALUE = (CASE WHEN RIGHT(B.PROPERTY_VALUE, 1) = '/' THEN B.PROPERTY_VALUE ELSE B.PROPERTY_VALUE + '/' END)
OR
A.PROPERTY_VALUE = (CASE WHEN RIGHT(B.PROPERTY_VALUE, 1) = '/' THEN RTRIM(B.PROPERTY_VALUE, '/') ELSE B.PROPERTY_VALUE END)
更为混乱,但可能对索引更为友好

  • 仅更改B表的值
  • 有必要对B进行扫描
  • 现在可以在上进行索引搜索

…我认为您意识到在
where
子句中需要
s。做内部连接可能比交叉连接更有效。他在最后有
。Xophmeister:至少在Oracle的世界里,这只是语法上的糖分,查询优化器无论如何都会处理执行计划。+1用于前期数据清理。否则,如果我们坚持加载劣质数据,我们每次使用时都必须对其进行处理。然后,您真的,真的,希望在加载数据时开始清理数据。通过这种方式,您可以将“清理”代码封装在一个地方,然后使用这些数据会变得更加高效。“请建议一种更好的方法来实现同样的效果,而不必使用PL/SQL过程来删除尾部斜杠”翻译:我的数据质量很差,但我想保留它们,因为我喜欢为自己创建工作。
RTRIM(A.PROPERTY_VALUE, '/') = RTRIM(B.PROPERTY_VALUE, '/')
A.PROPERTY_VALUE = (CASE WHEN RIGHT(B.PROPERTY_VALUE, 1) = '/' THEN B.PROPERTY_VALUE ELSE B.PROPERTY_VALUE + '/' END)
OR
A.PROPERTY_VALUE = (CASE WHEN RIGHT(B.PROPERTY_VALUE, 1) = '/' THEN RTRIM(B.PROPERTY_VALUE, '/') ELSE B.PROPERTY_VALUE END)