1

私のテーブルの 1 つに、MembersList というフィールドがあります。これは、セミコロンでLASTNAME/FIRSTNAME.MIDDLENAMEorMIDDLEINITIAL区切られた形式の名前のリストです(;)。例:

DOE/JOHN.PETER;SMITH/ANDREW.K;FORD/HENRY.GEORGE

別のレコードに名前が含まれている可能性がありますDOE/JOHN.Pが、この人物は上記の例と同じではない可能性がありますDOE/JOHN.PETER。彼の P は Paul または Philip を表している可能性がありますが、サービスのユーザーは彼を単にDOE/JOHN.P.

私が言うなら

SELECT * FROM Events WHERE MembersList LIKE '%DOE/JOHN.P%'

DOE/JOHN.PのレコードだけDOE/JOHN.PETERでなく、私が望んでいないレコードも取得します。このDOE/JOHN.P場合の は、ミドルネームのイニシャルが実際には P であり、P のみであるかのように処理する必要があります。2 番目のイニシャルを削除しようとしました%が、何も返されません。私はLIKEどのように見えるべきですか??

これは意味がありますか??

4

5 に答える 5

2

1 つのアプローチを次に示します。

SELECT * FROM Events WHERE CONCAT(';',MembersList,';') LIKE '%;DOE/JOHN.P;%'

ここでの秘訣は、セミコロン区切り記号を探していることであり、検索対象の文字列に先頭と末尾の区切り記号を追加します。

または、先頭と末尾の区切り文字を追加しないようにして、4 つの条件でテストすることもできます。文字列の中間要素、文字列の最初の要素、文字列の最後の要素、および文字列の唯一の要素として:

LIKE '%;foo;%'
LIKE 'foo;%'
LIKE '%;foo'
LIKE 'foo'
于 2012-10-05T14:14:38.963 に答える
2

次の 4 つの条件をテストする必要があります。

SELECT * FROM Events
WHERE MembersList = 'DOE/JOHN.P'
WHERE MembersList LIKE 'DOE/JOHN.P;%'
WHERE MembersList LIKE '%;DOE/JOHN.P'
WHERE MembersList LIKE '%;DOE/JOHN.P;%'

または、文字列にコンマが含まれていないことが確実な場合は、FIND_IN_SETを使用できます。

SELECT * FROM Events
WHERE FIND_IN_SET('DOE/JOHN.P', REPLACE(MembersList, ';', ','))

残念ながら、FIND_IN_SET はカンマ区切りのリストでしか機能しないため、使用する前にセミコロンをカンマに変換する必要があります。

これらのソリューションはすべて遅くなります。メンバーを別のテーブル (適切に正規化されたもの) に維持し、必要な場合にのみセミコロンで区切られたリストを作成できるとよいでしょう。

于 2012-10-05T14:12:39.907 に答える
2
SELECT * 
FROM Events 
WHERE MembersList = 'DOE/JOHN.P' 
    or MembersList LIKE 'DOE/JOHN.P;%' 
    or MembersList LIKE '%;DOE/JOHN.P;%' 
    or MembersList LIKE '%;DOE/JOHN.P' 
于 2012-10-05T14:12:40.227 に答える
1

like の代わりに正規表現を使用して、名前がセミコロンで終わっているかどうか、または文字列が最後にあるかどうかを確認できます

SELECT * FROM Events WHERE MembersList REGEXP 'DOE/JOHN\.P(;|$)'
于 2012-10-05T14:12:20.337 に答える
0

%ワイルドカードです。したがって、文字列 ( Doe/John.P%) の最後に配置すると、P で終わるものと、その P の後にあるものすべてが検索されます。

http://www.w3resource.com/sql/wildcards-like-operator/wildcards-like-operator.php

したがって、LIKE(%..%)構文を使用していて、次を区別したい場合:LIKE 'DOE/JOHN.P'との後にワイルドカードを配置することLIKE 'DOE/JOHN.PETER'はできません。PDOE/JOHN.P

%DOE/JOHN.P%両方をピックアップし.P.PETER

%DOE/JOHN.Pで終わるものは何でもピックアップしますp


orそれらをステートメントに組み合わせることができます。

LIKE ... OR LIKE....両方を検索するには、両方を実行します。

代わりに使用することをお勧めし=ます。

于 2012-10-05T14:13:04.453 に答える