2

我有两个表 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 过程来删除尾部斜杠。

4

3 回答 3

7

你有两个选择。

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

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

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

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

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

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

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

或者...

  • (确保 B.PROPERTY_VALUE 以 '/' 结尾,然后进行比较);或者
  • (确保 B.PROPERTY_VALUE 不以 '/' 结尾,然后进行比较)

如果其中任何一个条件为真,则 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 进行扫描
  • 现在可以在 A 上进行 INDEX SEEK
于 2011-11-29T10:07:45.803 回答
3

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

...
AND RTRIM(A.PROPERTY_VALUE,'/') = RTRIM(B.PROPERTY_VALUE,'/')
于 2011-11-29T10:06:46.380 回答
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, '/')
于 2011-11-29T10:07:12.687 回答