Сравните дубликаты для 4 полей в открытом SQL

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

Сценарий: у пользователя есть 4 поля для ввода. Имя (N1), фамилия (N2), дополнительное имя (N3) и дополнительная фамилия (N4).

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

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

РЕДАКТИРОВАТЬ: я не могу принять заказ, поскольку он был ранее разработан таким образом. Отсюда и сложности с комбинациями.

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


person qwerty    schedule 01.06.2016    source источник
comment
Ваш вопрос очень неясен. Вы пытаетесь найти пользователя в базе данных на основе данных пользователя, введенных в той или иной форме? Вы не можете предположить даже правильный порядок полей?   -  person lilalinux    schedule 01.06.2016
comment
Почему это нужно делать с помощью OpenSQL-запроса и почему для этой цели нельзя использовать регулярные выражения?   -  person Jagger    schedule 01.06.2016
comment
Попробуйте %N1% И %N2% И %N3% И %N4% И (N1% ИЛИ N2% ИЛИ N3% ИЛИ N4%) и убедитесь, что общий размер точно равен сумме всех частей   -  person lilalinux    schedule 01.06.2016
comment
Я добавил дополнительный комментарий к заказу   -  person qwerty    schedule 01.06.2016
comment
Вы действительно хотите, чтобы запись в БД начиналась с произвольного порядка частей имени, за которыми, возможно, следовал любой другой текст?   -  person lilalinux    schedule 01.06.2016
comment
Будет ли следующее условие возможным? N1 IN ('N1', 'N2', 'N3', 'N4') AND N2 IN ('N1', 'N2', 'N3', 'N4') AND N3 IN ('N1', 'N2', 'N3', 'N4') AND N4 IN ('N1', 'N2', 'N3', 'N4')?   -  person Jagger    schedule 01.06.2016
comment
% указывает, что в БД есть только одно поле   -  person lilalinux    schedule 01.06.2016


Ответы (2)


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

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

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

person lilalinux    schedule 01.06.2016
comment
Проверьте редактирование 2. Мне нравится идея сравнения отдельных полей. Но как здесь помогает длина? Вроде в open-sql ищет подстроку. Так что, по сути, он уже действует как сопоставитель шаблонов. - person qwerty; 02.06.2016
comment
Общая длина гарантирует, что нет других скрытых символов, поэтому, если строка foo содержится в любом месте строки x, а строка bar содержится в любом месте строки x, тогда строка может выглядеть как moobarmoofoo. Если вы гарантируете, что length(x)=length(foo)+length(bar), то строка x должна быть foobar или barfoo. - person lilalinux; 02.06.2016
comment
спасибо .. Я думаю, что это решает мою проблему получения всех возможных комбинаций. Я отмечу это как правильный ответ. - person qwerty; 03.06.2016

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

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.

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

person Jagger    schedule 01.06.2016