0

検索文字列に基づいてテーブルからレコードを検索します。この検索は、ストアド プロシージャの一部です。

必要なものは次のとおりです。 1. テーブル ppl には、name,surname の形式のデータを含む列 name があります。たとえば、レコードは barack,oba bar,obama および barack,obama です。

  1. 検索文字列に基づいてレコードを選択します。検索文字列は、名前または姓にすることができます。
  2. 検索文字列に基づいて正確な検索が必要です。検索文字列が bar かどうかを意味します。barack,obama レコードを返すべきではなく、bar,obama のみを返す必要があります。姓の部分の類似完全一致検索。

  3. 検索文字列に姓名があるかどうかはわかりません。したがって、検索文字列は「oba」でもかまいません..そして、「barack,oba」レコードのみを返す必要があります。

これまでに試みた以下のアプローチ。しかし、これらのどれもうまくいきませんでした:

  1. 'bar,%' のような名前または '%,bar' のような名前の ppl から名前を選択します。これは名前の部分では機能しますが、姓の部分では機能しません。

'oba,%' のような名前または '%,oba' のような名前の ppl から名前を選択します。適切な結果を出していません。

  1. select name from ppl where name = ANY('%,oba',oba,%'); - 機能していません

  2. select name from ppl where regexp_like (name,'^,oba$') OR regexp_like (name,'oba$,^'); - 機能していません

この場合、あなたの考えを共有していただきたいと思います。

4

2 に答える 2

1

正規表現 (REGEX) を使用する必要があります。

たとえば、それらの使用方法を説明している多くのサイトがあります。

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm

http://www.dba-oracle.com/t_regular_expressions.htm

http://orafaq.com/node/2404

あなたが説明した例については(私が続けなければならないのはそれだけです)、次を使用できます:

SELECT name_column
  FROM ppl
 WHERE REGEXP_INSTR(name_column, '^.*'||v_name||'(, *|$).*', 1, 1, 0, 'c') > 0;

名前文字列をプログラムでv_nameに置き換えます。名前文字列を大文字と小文字を区別せずに検索する場合:

SELECT name_column
  FROM ppl
 WHERE REGEXP_INSTR(name_column, '^.*'||v_name||'(, *|$).*', 1, 1, 0, 'i') > 0;

編集:おそらく REGEXP_INSTR よりも REGEXP_LIKE を使用できますが、私は手に似たものを持っていました。

例: 大文字と小文字を区別しない:

SELECT name_column
  FROM ppl
 WHERE REGEXP_LIKE(name_column, '^.*'||v_name||'(, *|$).*', 'i');

大文字と小文字を区別:

SELECT name_column
  FROM ppl
 WHERE REGEXP_LIKE(name_column, '^.*'||v_name||'(, *|$).*', 'c');

お役に立てれば...

于 2011-09-08T12:58:08.117 に答える
0

サンプルデータとSQLに基づいて、あなたの質問には問題があることがわかりません。

まず、テーブルとデータを(SQL Plusを使用して)複製しました。

SQL> create table ppl (name varchar2(30));

Table created.

SQL> insert into ppl values ('barack,oba');

1 row created.

SQL> insert into ppl values ('bar,obama');

1 row created.

SQL> insert into ppl values ('barack,obama');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from ppl;

NAME                                                                            
------------------------------                                                  
barack,oba                                                                      
bar,obama                                                                       
barack,obama                                                                    

今あなたのクエリ:

SQL> select * from ppl where name like 'bar,%' or name like '%,bar';

NAME                                                                            
------------------------------                                                  
bar,obama                                                                       

そのとおりです。

SQL> select * from ppl where name like 'oba,%' or name like '%,oba';

NAME                                                                            
------------------------------                                                  
barack,oba                                                                      

それも正しいです。

では、どのような結果が得られますか?

于 2011-09-08T13:54:41.080 に答える