1

I have to write an SQL query to find the id's in a table which are similar to the ID's of another table.

The problem while querying from the TABLE_B is that, in TABLE_B these queries will be having some String attached to it.

For example:

If the ID passed is: 123456789

Then in TABLE_B it will be like ABC12456789XYZ

So to select these, I thought of writing an SQL query as shown below, iterating thousands of and clauses:

String idCsList = "";
int i = 1;
for( String ids : idList ) {
   if( i == 1 ) {
      idCsList = idCsList + "'%" + ids + "%'" + ")";
      i++;
      continue;
   }
   idCsList = idCsList + " AND TABLE_B.id LIKE (" + "'%" + ids + "%'" + ")";
   i++;
}

But this idea will not work because of the limit on the length of an SQL query, and the query will fail. It also takes too long.

Is there a better way to query using many wildcard operators in a more performance optimized way?

4

5 に答える 5

1

あなたが与えた例から、ある種の関数を使用して table_B.id から table_A.id を抽出できるように見えます。

  1. 最初のステップとして、そのような関数を作成し、select で使用できます。しかし、これはおそらくパフォーマンスに関してはあまり役に立ちません (実際にはパフォーマンスを損なう可能性があります) が...

  2. 関数を使用して table_b に関数ベースのインデックスを作成すると、SQL エンジンが使用するテーブルに関数値がちょうどそこにあるように見えます。

もちろん、これにはテーブルの変更が必要です...あなたのケースでこれが可能かどうかはわかりません。

于 2013-03-08T06:43:11.050 に答える
1

SQL では、に渡される文字列を構築できますLIKE

SELECT * 
FROM TABLE_A A INNER JOIN TABLE_B B ON A.ID = B.ID
WHERE B.ID LIKE ('%' + A.ID + '%')
于 2013-03-08T07:05:02.020 に答える
0

SELECT * from TABLE_A a Inner Join TABLE_B b on b.id like'%' + a.id +'%' where a.id in(idCsList)

'%' + a.id +'%'には適切な連結関数を使用してください

于 2013-03-08T06:35:31.483 に答える
0

TABLE_AのIDを持つインデックス付きの列を保持し、prefix=idの場合はSELECTを保持します。

テーブル全体をスキャンする必要があるため、接頭辞'%'が付いたLIKE述語は非常に高価です。

于 2013-03-08T06:35:34.920 に答える
0

ecampver のような他の回答者を試しましたか?

Oracleデータベースを実行していると仮定して、これを試してください。次のように簡単です。

select AID from A join B on BID like '%' || AID || '%';
于 2014-01-02T20:47:22.940 に答える