3

フィールド 'clinicNo' を持つデータベースがあり、そのフィールドには 1234A、2343B、9999Z などのレコードが含まれています ......

誤って select ステートメントに '1234A' の代わりに '1234B' を使用した場合、指定された文字列と 1 文字だけ異なるclinicNos を含む結果セットを取得したいと考えています (つまり、上記の 1234B)。

例えば。フィールドには次の値が含まれる場合があります。1234A、1235B、5433A、4444S、2978C 選択クエリに「1235A」を使用すると、結果として 1234A と 1235B が返されます。

4

4 に答える 4

1

列の選択にSUBSTRINGを使用できます。以下の例では、「AからZ」で「1235」を返します

select *  from TableName WHERE SUBSTRING(clinicNo, 0, 5) LIKE '1235A'
于 2013-01-08T08:32:19.880 に答える
1

あなたが探しているのは、レーベンシュタイン距離アルゴリズムと呼ばれるものです。PHPにはレーベンシュタイン関数がありますが、実際には MySQL でこれを行いたいと考えています。

MySQL でレーベンシュタイン関数を実装するには、2 つの方法があります。1 つ目は、入力と出力が異なることを除いて、STORED TRANSACTION とほぼ同じように動作する STORED FUNCTION を作成することです。これは小さなデータセットでは問題ありませんが、数千行に近づくと少し遅くなります。ここで詳細情報を見つけることができます: http://kristiannissen.wordpress.com/2010/07/08/mysql-levenshtein/

2 番目の方法は、C/C++ でユーザー定義関数を実装し、それを共有ライブラリ (*.so ファイル) として MySQL にリンクすることです。このメソッドは、STORED FUNCTION を使用してライブラリを呼び出します。つまり、このメソッドまたは最初のメソッドの実際のクエリは同じである可能性があります (両方の関数への入力が同じである場合)。この方法の詳細については、http ://samjlevy.com/2011/03/mysql-levenshtein-and-damerau-levenshtein-udfs/ を参照してください。

これらの方法のいずれかを使用すると、クエリは次のようになります。

SELECT clinicNo FROM words WHERE levenshtein(clinicNo, '1234A') < 2;

「しきい値」の値は、元の単語の長さに応じて変化する必要があることに注意してください。パーセンテージ値で考える方が良いです。つまり、単語の半分 = 50%、「用語」の半分 = 2 です< 2。しかし、追加のエラーを説明するためにさらに進むことができます。

参照:ウィキペディア: レーベンシュタイン距離.

于 2013-01-08T08:48:10.137 に答える
0
SELECT * FROM TABLE
WHERE ClinicNo like concat(LEFT(ClinicNo,4),'%')
于 2013-01-08T08:30:36.980 に答える
0

一般的な開発では、Levenshtein のような関数を使用して 2 つの文字列の違いを見つけることができ、「類似度」の数が返されます。おそらく、最も類似性の高い結果が必要です。

MySQL でもレーベンシュタインを取得するには、この投稿をお読みください。

または、すべての結果を取得して、PHP のレーベンシュタイン関数を使用します。

于 2013-01-08T08:49:06.920 に答える