我有两个表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过程删除尾部斜杠,建议更好的方法来实现相同的目标。
答案 0 :(得分:7)
您有两种选择。
首先是在使用前清理您的数据。
在任何URL存储在系统中之前,如有必要,添加或删除(如首选)斜杠。通过这种方式,确保所有URL都以相同的格式存储,以便于使用。
第二种是在运行时清理您的数据。
我不提倡这些选项,因为它们会产生不必要的开销,并且可能妨碍索引的最佳使用。
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)
非常麻烦,但可能更友好指数
答案 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, '/')