4

これが私のテーブルだとします:

ID  STRING
1   'ABC'
2   'DAE'
3   'BYYYYYY'
4   'H'

別の行の STRING 変数のどこかにある STRING 列の文字を少なくとも 1 つ含むすべての行を選択したいと考えています。

たとえば、1and2にはA共通点があり、1ad3にはB共通点があります4が、他の行と共通する文字はありません。したがって、クエリは最初の 3 行のみを返す必要があります。

どの行に一致したかを知る必要はありません。

ありがとう!

4

3 に答える 3

5

distinct@ABCade : 良い解決策ですが、 or なしで実行できますjoin

SELECT * FROM test t1
WHERE EXISTS
(
  SELECT * FROM test t2
  WHERE t1.id<>t2.id AND
  regexp_like(t1.string, '['|| replace(t2.string, '.[]', '\.\[\]')||']')
)

現在の行に1つの一致が見つかるとすぐに比較を停止するため、クエリは文字列を余分な行と比較しません...

フィドルを参照してください。

于 2012-10-16T21:10:46.080 に答える
4

@GolezTrolの答えは良いものですが、別のアプローチがあります。

select distinct t1."ID", t1."STRING" 
from table1 t1, table1 t2
where t1."ID" <> t2."ID"
and regexp_like(t1."STRING", '['|| t2."STRING"||']')

最初にテーブルのカルテシアン製品を取得
します。次に、同じ文字列をそれ自体と比較しないことを確認して
から、一方の文字列から正規表現を作成して、もう一方の文字列と比較します。[<string1>]つまり、文字列には、[ ]すべてstring1の文字の1つが含まれている必要があります。

これがフィドルです

于 2012-10-16T21:04:34.113 に答える
1

このような:

select distinct
  id, name
from
  (select distinct
    x.id,
    x.NAME,
    length(x.NAME) as leng,
    substr(x.name, level, 1) as namechar
  from
    YourTable x
  start with
    level = 0
  connect by
    level <= length(x.name)) y
where
  exists 
    (select 
      'x' 
    from 
      YourTable z 
    where 
      instr(z.name, y.namechar) > 0 and
      z.id <> y.id)
order by 
  id      

機能:

まず、(内部選択) 名前の各文字の数値を返す数値ジェネレーターでテーブルを使用します。これで、各レコードYourTableが返されLength(Name)、それぞれ別の数値が返されます。その生成された番号は、その文字 (substr) を分離するために使用されます。

次に (最上位の where 句でサブ選択)、その孤立した文字を含むレコードが存在するかどうかを確認します。複数の文字が一致する場合、レコードが複数回返されるため、Distinct が必要です。namechar外側の選択フィールド リストに追加して、一致する文字を表示できます。

于 2012-10-16T20:41:33.190 に答える