文字列のリストがあります:
- HEAWAMFWSP
- TLHHHAFWSP
- あわわわわ
- アウアワムハ
これらの文字列はそれぞれ、2 つの文字の組み合わせの 5 つのペアを表します (つまり、HE AW AM FW SP)
私が SQL でやろうとしているのは、ペアで重複しているすべての文字列を表示することです。
上から弦番号 3 を取ります。AW AM FW HH AW. 重複ペア (AW) があるため、このレコードを表示する必要があります。
これは可能ですか?
ありがとう!
現在の要件を考えると、はい、これは実行可能です。これは、再帰的な CTE を使用するバージョン (ベンダーの特異性に合わせてテキストを調整する必要がある場合があります) で、DB2 で作成およびテストされています。文字列内にペアのインスタンスが 2 つ以上ある場合、または重複のセットが複数ある場合は、複数の行が返されることに注意してください。
WITH RECURSIVE Pair (rowid, start, pair, text) as (
SELECT id, 1, SUBSTR(text, 1, 2), text
FROM SourceTable
UNION ALL
SELECT rowid, start + 2, SUBSTR(text, start + 2, 2), text
FROM Pair
WHERE start < LENGTH(text) - 1)
SELECT Pair.rowid, Pair.pair, Pair.start, Duplicate.start, Pair.text
FROM Pair
JOIN Pair as Duplicate
ON Duplicate.rowid = Pair.rowid
AND Duplicate.pair = Pair.pair
AND Duplicate.start > Pair.start
これはあまり洗練されたソリューションではありませんが、機能し、重複した一致がいくつあっても行を 1 回だけ返します。部分文字列関数は SQLServer 用ですが、Oracle 用のものかどうかはわかりません。
select ID, Value
from MyTable
where (substring(Value,1,2) = substring(Value,3,4)
or substring(Value,1,2) = substring(Value,5,6)
or substring(Value,1,2) = substring(Value,7,8)
or substring(Value,1,2) = substring(Value,9,10)
or substring(Value,3,4) = substring(Value,5,6)
or substring(Value,3,4) = substring(Value,7,8)
or substring(Value,3,4) = substring(Value,9,10)
or substring(Value,5,6) = substring(Value,7,8)
or substring(Value,5,6) = substring(Value,9,10)
or substring(Value,7,8) = substring(Value,9,10))