Ram*_*Ram 2 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
Run Code Online (Sandbox Code Playgroud)
我有以下查询来获取具有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
Run Code Online (Sandbox Code Playgroud)
这里的问题是因为值是URL,它们可能有也可能没有尾随斜杠.无论尾随斜线,我都希望连接发生.请使用PL/SQL过程删除尾部斜杠,建议更好的方法来实现相同的目的.
你有两个选择.
首先是在使用前清理您的数据.
在任何URL存储在系统中之前,如有必要,添加或删除(如首选)斜杠.通过这种方式,确保所有URL都以相同的格式存储,以便于使用.
第二个是在运行时清理您的数据.
我不提倡这些选项,因为它们会产生不必要的开销,并且可能妨碍索引的最佳使用.
RTRIM(A.PROPERTY_VALUE, '/') = RTRIM(B.PROPERTY_VALUE, '/')
Run Code Online (Sandbox Code Playgroud)
最干净的代码,但可能会阻止索引使用.
要么...
如果满足以下任一条件,则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)
Run Code Online (Sandbox Code Playgroud)
更麻烦,但可能更友好