3

大規模なデータベースで、5〜7文字のさまざまな長さの単語のリストを検索しています。これまでのところ、私は持っています:

Select *
  from sometable
 Where upper("Description") like any ("%ABC_123%", "%ABC_124%", "%DE_25%")

クエリで見つかった単語も返したいのですが、subtr関数で単語のリストを複製せずにこれを行う方法に固執しています。

これを行うにはおそらくもっと良い方法があり、私はいくつかの方向性をいただければ幸いです。

4

4 に答える 4

5

Rob Pallerがすでに述べたように、TD14には正規表現があります。

Select sometable.*,
       REGEXP_SUBSTR(Description,'((ABC_)(123|124)|(DE_(25)))') AS match
  from sometable
 Where match <> '';

これは、何百ものLIKEよりも効率的であるはずです。

さらに、これは単純化される場合があります。たとえば、ABC_またはDE_の後に2桁または3桁が必要な場合:

       REGEXP_SUBSTR(Description,'(ABC_|DE_)([0-9]{2,3})') AS match
于 2014-03-04T12:29:31.657 に答える
3

POSITION機能と複数のOR条件を試しましたか?

SELECT *
FROM TABLE
WHERE POSITION('ABC_123' IN UPPER("Description") > 0
   OR POSITION('ABC_124' IN UPPER("Description") > 0
   OR POSITION('DE_25' IN UPPER("Description") > 0;

いずれにせよ、これはTeradataでは高価なCPU/IOプロセスになると思います。これを容易にするTeradata13.x以前のリリースのネイティブ関数を知りません。Teradata 14.x(14.10だと思います)は、これをより簡単なソリューションにする可能性のある正規表現サポートをネイティブに導入することになっています。

あなたはいくつのリストワードについて話しているのですか?

LIKE述語でサブクエリを使用するとどうなりますか?

SELECT *
FROM myTable
WHERE UPPER("Description") 
 LIKE (SELECT ListWord
       FROM myListWords);

リストの単語をサブクエリのパターンとして表示する必要がある場合があります。

SELECT *
FROM myTable
WHERE UPPER("Description") 
 LIKE (SELECT '%' || ListWord || '%' AS ListWordPattern
       FROM myListWords);
于 2012-09-25T15:33:49.290 に答える
1

4年後ですが、とにかく... LIKE参加(および複数の一致の場合はQUALIFY)でうまく機能します

例えば

SELECT a.orig_pattern
,b.my_keyword
FROM table_with_data a
JOIN table_with_keywords b
ON a.orig_pattern LIKE '%'||b.my_keyword||'%'
QUALIFY row_number() OVER (partition by orig_pattern ORDER by orig_pattern) = 1
于 2019-01-02T11:09:00.223 に答える
0

行を見つけるには、REGEXPを使用することもできます。

Select *
from sometable
Where Description REGEXP 'ABC_123|ABC_124|DE_25'

説明フィールドの唯一の単語でない限り、見つかった単語を返すことで、パートBを理解できませんでした。それが唯一の単語である場合は、説明フィールドの内容を返すだけです。

于 2014-03-04T00:09:16.820 に答える