2016-06-01 9 views
0

Я хочу сравнить, есть ли дубликаты по 4 полям в открытом SQL.Сравнение дубликатов для 4 полей в открытом SQL

Сценарий: Пользователь имеет 4 поля для ввода. Имя (N1), фамилия (N2), дополнительное имя (N3) и дополнительная фамилия (N4). Сейчас алгоритм работает следующим образом: он объединяет N1 + N2 +%, а затем также N2 + N1 +%. Поэтому, если пользователь вводит какие-либо поля, запрос ищет N1N2% или N2N1%. Это означает, что для 2 полей есть 2! возможны комбинации. Теперь с двумя дополнительными полями этот алгоритм взрывается, так как будет 4! комбинации для проверки. Любые идеи, как справиться с этим?

Примечание: Мы проводим такую ​​комбинацию, потому что пользователь может вводить данные в любом из указанных полей ввода. Поэтому мы проверяем все комбинации полей. К сожалению, это невозможно изменить.

EDIT: Я не могу принять заказ, как он был ранее разработан таким образом. Следовательно, осложнения с комбинациями.

Редактировать2: Мне нравится идея проверки отдельных деталей. Но мы хотим идеально объединить все строки вместе и проверить подстроку в БД. В open-sql это делается с использованием аналогичного утверждения. Наша таблица DB имеет такую ​​конкатенированную строку, которая уже сохранена для комбинации N1 + N2. Теперь это необходимо расширить для 4 полей.

+0

Ваш вопрос очень неясен. Вы пытаетесь найти пользователя в базе данных на основе данных пользователя, введенных в какой-либо форме? Не можете ли вы принять даже правильный порядок полей? – lilalinux

+0

Почему это нужно делать с помощью запроса OpenSQL и почему вы не можете использовать регулярные выражения для этой цели? – Jagger

+1

Попробуйте% N1% И% N2% И% N3% И% N4% И (N1% ИЛИ N2% ИЛИ N3% ИЛИ N4%) и убедитесь, что суммарный размер точно равна сумме всех частей – lilalinux

ответ

2

Ключ к вашей задаче проверки всех частей имен индивидуально с ведущей и ведомой «%» и проверить общий размер записи БД от суммы частей имени:

поле = («%» + N1 + '%') AND field = ('%' + N2 + '%') AND field = ('%' + N3 + '%') AND field = ('%' + N4 + '%') И ДЛИНА (поле) = ДЛИНА (N1 + N2 + N3 + N4)

Это найдет матч. Вы можете использовать его для выбора нормализованной конкатенации имен и использовать GROUP BY и HAVING count (*)> 1 для поиска дубликатов.

+0

Проверьте edit2. Мне нравится идея сравнения отдельных полей. Но как здесь помогает длина? Как в open-sql ищет подстроку. Таким образом, по существу, он уже действует как образец. – qwerty

+0

Общая длина гарантирует отсутствие других символов, поэтому если строка «foo» содержится где угодно в строке x, а строка «bar» содержится где угодно в строке x, тогда строка может выглядеть как «moobarmoofoo».Если вы гарантируете длину (x) = length (foo) + length (bar), то строка x должна быть «foobar» или «barfoo». – lilalinux

+0

спасибо .. Я думаю, что он решает мою проблему получения всех возможных комбинаций. Я буду отмечать это как правильный ответ. – qwerty

0

Если пользователь не заботится о заказе и вы хотите проверить наличие дубликатов, то следующее условие соответствует вашим критериям, я думаю.

SELECT ... 
    FROM ... 
    INTO TABLE ... 
    WHERE N1 IN (@INPUT_N1, @INPUT_N2, @INPUT_N3, @INPUT_N4) 
    AND N2 IN (@INPUT_N1, @INPUT_N2, @INPUT_N3, @INPUT_N4) 
    AND N3 IN (@INPUT_N1, @INPUT_N2, @INPUT_N3, @INPUT_N4) 
    AND N4 IN (@INPUT_N1, @INPUT_N2, @INPUT_N3, @INPUT_N4). 

IF sy-dbcnt > 0. 
    "duplicates found, do something... 
ENDIF. 

Конечно, когда есть мусор в базе данных, где, например, все четыре поля являются одинаковыми, то это не будет возвращать настоящий дубликат.