Как игнорировать косую черту при объединении двух строковых столбцов в SQL - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть две таблицы 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 для удаления завершающего слеша.

Ответы [ 3 ]

7 голосов
/ 29 ноября 2011

У вас есть два варианта.

Первое - это очистить ваши данные перед использованием.

Прежде чем какой-либо URL-адрес будет сохранен в системе, добавьте или удалите (при желании) косую черту, если необходимо. Таким образом, убедитесь, что все URL-адреса хранятся в одном формате для простоты использования.

Второй - очистить ваши данные во время выполнения.

Я не защищаю эти варианты, поскольку они несут ненужные накладные расходы и могут помешать оптимальному использованию индексов.

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

Чистый код, но, вероятно, препятствует использованию индекса.

  • Значения из Таблицы A и Таблицы B изменяются
  • Вероятно, для обеих таблиц требуется SCAN

Или ...

  • (убедитесь, что B.PROPERTY_VALUE заканчивается на «/», затем выполните сравнение); OR
  • (убедитесь, что 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
  • нужен СКАН на Б
  • ПОИСК ИНДЕКСА на А теперь возможен
3 голосов
/ 29 ноября 2011
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, '/')
3 голосов
/ 29 ноября 2011

Вы можете легко удалить косые черты, используя функцию RTRIM:

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