質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.95%

SQL文でカンマ区切りの値の検索で3つ以上一致していたらレコードを引っ張ってきたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,771

検索対象カラムに、
1,2,3,4,5,6,7,8,9,10という値が格納されていて
そのカラムに対して
1,2,3,4,5で検索をかけて
検索をかけた値が3つ以上一致したものを取得したい時の
SQL文を教えてほしいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+14

9.18. 配列関数と演算子
https://www.postgresql.jp/document/9.4/html/functions-array.html
を見ながら、PostgreSQL9.3で作ってみました :-)

with t(Val) as(
values('1,2'),
      ('1,2,3'),
      ('1,2,3,4'))
select Val,
exists(select * from UnNest(string_to_array('1,2,3,4,5',','))
       intersect
       select * from UnNest(string_to_array(Val,','))
       OffSet 2 Limit 1) as IsOK
  from t
order by Val;

|     Val |  IsOK |
|---------|-------|
|     1,2 | false |
|   1,2,3 |  true |
| 1,2,3,4 |  true |

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

テーブル仕様を変えずに実現するなら、以下のような感じでしょうか。

create table tb_test
(
 id integer not null auto_increment
,column1 char(100)
,PRIMARY KEY(id)
);

insert into tb_test(column1) values("1,2,3,4,5,6,7,8,9,10"),("1,2");

select    v_mid.*
from    (
            select v_hit.id, COUNT('X') as cnt
            from    (
                                    select id from tb_test T1 where    T1.column1    like '%,1,%' or    T1.column1    like '1,%' or    T1.column1    like '%,1'
                        UNION ALL    select id from tb_test T1 where    T1.column1    like '%,2,%' or    T1.column1    like '2,%' or    T1.column1    like '%,2'
                        UNION ALL    select id from tb_test T1 where    T1.column1    like '%,3,%' or    T1.column1    like '3,%' or    T1.column1    like '%,3'
                        UNION ALL    select id from tb_test T1 where    T1.column1    like '%,4,%' or    T1.column1    like '4,%' or    T1.column1    like '%,4'
                        UNION ALL    select id from tb_test T1 where    T1.column1    like '%,5,%' or    T1.column1    like '5,%' or    T1.column1    like '%,5'
                    ) as v_hit
            GROUP BY v_hit.id
        ) v_mid
where    v_mid.cnt >= 3
;


PS:テーブル仕様や該当カラムのデータパターンやデータの意図する内容(例:複数のチェックボックスの内容を保持している等)が書いてあれば、より良い回答を得られると思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/29 14:02

    COUNT('X')とT1ってどういった記述でしょうか?
    T1はテーブル名ですか?

    キャンセル

  • 2016/08/29 18:05

    SELECT COUNT(*) と SELECT 'X' は分かりますか?
    COUNT(*)の場合、*の中身であるカラムの中身をわざわざ参照しに行ってしまうため、
    厳密には処理時間がかかります。
    ですが、’X'は固定文字なので、行数をカウントするには、
    COUNT('X')の方が処理時間が短いのです。

    T1はテーブルの別名です。カラムと同じように
    FROM tb_test as T1
    とも記載できます。

    キャンセル

  • 2016/08/29 21:53

    なるほど!勉強なります!ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る