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

时间:2011-11-29 10:04:31

标签: 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”

SELECT A.GUID as SOURCE_GUID, 
       B.GUID as DESTINATION_GUID 
FROM
       tableA A,
       tableB B
WHERE
       A.PROPERTY_NAME = "URL" AND
       A.PROPERY_NAME  = B.PROPERTY_NAME AND
       A.PROPERTY_VALUE = B.PROPERTY_VALUE

这里的问题是因为值是URL,它们可能有也可能没有尾随斜杠。无论尾随斜线,我都希望连接发生。请使用PL / SQL过程删除尾部斜杠,建议更好的方法来实现相同的目标。

3 个答案:

答案 0 :(得分:7)

您有两种选择。

首先是在使用前清理您的数据。

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

第二种是在运行时清理您的数据。

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

RTRIM(A.PROPERTY_VALUE, '/') = RTRIM(B.PROPERTY_VALUE, '/')

最干净的代码,但可能会阻止使用索引。

  • 正在修改表A和表B中的值
  • 这可能需要两个表上的SCAN

或者...

  • (确保B.PROPERTY_VALUE以'/'结尾,然后进行比较); OR
  • (确保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)

非常麻烦,但可能更友好指数

  • 仅更改B表值
  • B上的扫描是必要的
  • 现在可以查看A上的INDEX SEEK

答案 1 :(得分:3)

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

...
AND RTRIM(A.PROPERTY_VALUE,'/') = RTRIM(B.PROPERTY_VALUE,'/')

答案 2 :(得分:3)

SELECT A.GUID as SOURCE_GUID, 
       B.GUID as DESTINATION_GUID 
FROM   tableA A,
       tableB B
WHERE  A.PROPERTY_NAME = "URL"
AND    A.PROPERY_NAME = B.PROPERTY_NAME
AND    RTRIM(A.PROPERTY_VALUE, '/') = RTRIM(B.PROPERTY_VALUE, '/')