2016-06-01 7 views
0

開いているSQLの4つのフィールドに重複があるかどうかを比較したいと思います。開いているSQLの4つのフィールドの重複を比較

シナリオ:ユーザーは入力する4つのフィールドを持っています。名(N1)、姓(N2)、追加の名(N3)および追加の姓(N4)。 アルゴリズムは次のように動作します.N1 + N2 +%を連結し、さらに N2 + N1 +%を連結します。したがって、ユーザがいずれかのフィールドに入力すると、クエリはN1N2%またはN2N1%を検索します。これは2つのフィールドを意味し、2つあります!可能な組み合わせ。今度は2つのフィールドが追加され、このアルゴリズムは4つになるので爆発します!チェックする組み合わせ。どのようにこれに取り組むための任意のアイデアですか?

注:ユーザーが指定した任意の入力フィールドにデータを入力できるため、この種の組み合わせチェックを行います。そこで、フィールドのすべての組み合わせをチェックします。残念ながら、これは変更できません。

EDIT: このような方法で以前に設計されたような注文はできません。したがって、組み合わせによる合併症。

Edit2: 私は個々の部分をチェックするのが好きです。しかし、私たちがやりたいことは、理想的にはすべての文字列を連結し、DB内の部分文字列をチェックすることです。オープンSQLでは、それは同じステートメントを使用して行われます。私たちのDBテーブルには、N1 + N2の組み合わせのためにすでに格納されている連結された文字列があります。これは現在4つのフィールドに拡張する必要があります。

+0

あなたの質問は非常に不明です。何らかの形で入力されたユーザーの詳細に基づいてデータベース内のユーザーを検索しようとしていますか?あなたはフィールドの正しい順序さえ仮定できませんか? – lilalinux

+0

なぜOpenSQLクエリを使用しなければならないのですか?その目的のために正規表現を使用できないのはなぜですか? – Jagger

+1

%N1%AND%N2%AND%N3%AND%N4%AND(N1%OR N2%OR N3%OR N4%)を試し、合計サイズが正確にすべての部品の合計であることを確認してください – lilalinux

答えて

2

問題の鍵は、先頭と末尾の「%」で個別にすべての名前の部分をチェックし、名前の部分の総和に対するデシベルエントリの合計サイズをチェックします

フィールドは=(「%」+をN1 + '%')ANDフィールド=( '%' + N2 + '%')ANDフィールド=( '%' + N3 + '%')ANDフィールド=( '%' + N4 + '%')AND LENGTH (field)= LENGTH(N1 + N2 + N3 + N4)

これは一致します。これを使用して、名前の正規化された連結をSELECTし、GROUP BYおよびHAVING count(*)> 1を使用して重複を検索することができます。

+0

edit2を確認してください。私は個々のフィールドを比較する考えが好きです。しかし、ここで長さはどのように役立っていますか? open-sqlと同様に、部分文字列を探します。だから本質的にはすでにパターンマッチャーのように働いています。 – qwerty

+0

文字列xのどこにでも文字列 "foo"が含まれ、文字列xのどこに文字列 "bar"が含まれていても、文字列は "moobarmoofoo"のように見えます。length(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. 

例えば4つのすべてのフィールドが同じデータベース内にゴミがあると、これは本当の重複を返しません。

関連する問題