実現したいこと
- 以下のテーブル(前提に記載)において、idが同じname同士を比較し、末尾2文字以外の文字列が前方一致するレコード以外のレコードを抽出する。
前提
- テーブル(以下、Table)
id | name |
---|---|
integer | character varying(文字数制限なし) |
- 利用環境
PostgreSQL 15.3, compiled by Visual C++ build 1914, 64-bit (Windows)
例、期待結果、現状
id | name |
---|---|
1 | abcdefg0 |
1 | abcdefg1 |
1 | abcdefg |
1 | xyz |
2 | abcdefg |
2 | xyz |
- 期待結果
id | name |
---|---|
1 | xyz |
2 | abcdefg |
2 | xyz |
(注釈)id = 1において、name = 'abcdefg0', 'abcdefg1', 'abcdefg'の末尾2文字以外の文字列が前方一致するため、それら以外のレコードが抽出されることを期待する。
すべてのレコードが抽出されない状況(出力結果0行)
該当のソースコード
PostgreSQL
1SELECT t1.id, t1.name 2FROM Table t1 3WHERE NOT EXISTS ( 4 SELECT * 5 FROM Table t2 6 WHERE t1.id = t2.id 7 AND t1.name LIKE CONCAT(substring(t2.name, 1, length(t2.name) - 2), '%') 8) 9ORDER BY id;
試したこと
- 末尾2文字以外の文字列を「substring(t2.name, 1, length(t2.name) - 2)」で表現。
- 前方一致するかの判断を「LIKE」演算子 + 「CONCAT」関数と「%」(ワイルドカード)で表現。
- 1, 2が一致しないものを抽出するため、「NOT EXISTS」を使用。
要旨
お恥ずかしい限りですが、「試したこと」に記載の内容へ辿り着くのに数日要しました。ここからどう変えれば良いか、何が間違っているのか分からず止まっています。
どんなことでも構いませんので、ご教示いただけたら幸いです。よろしくお願いいたします。
0 コメント