【问题标题】:How to ignore trailing slash while joining two string columns in SQL如何在 SQL 中连接两个字符串列时忽略斜杠
【发布时间】:2012-01-08 16:24:45
【问题描述】:

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

【问题讨论】:

  • “请提出一种更好的方法来实现相同的目标,而不使用 PL/SQL 过程来删除尾部斜杠” 翻译:我的数据质量很差,但我想保留它们,因为我喜欢为自己创作作品。

标签: sql oracle slash trailing


【解决方案1】:

你有两个选择。

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

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

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

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

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

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

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

或者……

  • (确保 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

【讨论】:

  • +1 用于预先清理数据。否则,如果我们坚持要加载 shonky 数据,我们必须每次使用它都处理它。
  • 那么您真的,真的,想要在数据加载时开始清理数据。这样你就可以将你的“清理”代码封装在一个地方,然后使用这些数据变得更加高效。
【解决方案2】:
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, '/')

【讨论】:

  • ...我认为您意识到您在 where 子句中需要 ANDs。执行内部连接也可能比交叉连接更有效。
  • 他在行尾有AND
  • Xophmeister:至少在 Oracle 世界中,这只是语法糖,无论如何查询优化器都会处理执行计划。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多