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

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过程删除尾部斜杠,建议更好的方法来实现相同的目的.

Mat*_*lie 7

你有两个选择.

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

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

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

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

RTRIM(A.PROPERTY_VALUE, '/') = RTRIM(B.PROPERTY_VALUE, '/')
Run Code Online (Sandbox Code Playgroud)

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

  • 表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)
Run Code Online (Sandbox Code Playgroud)

更麻烦,但可能更友好

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