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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

561閲覧

SQLでの必要十分条件のデータ取得

TanakaJirou

総合スコア18

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2022/07/02 04:58

編集2022/07/02 05:01

下記条件で、結果期待値を取得するSQLを知りたいです

検索値が含まれているレコードかつ、一致度が高い順に並び替えて取得
検索地が含まれていなくても問題なし

試したこと
select * from table where
(tag1 = 'A' or tag2 = 'A' or tag3 = 'A') AND
(tag1 = 'B' or tag2 = 'B' or tag3 = 'B') AND
(tag1 = 'C' or tag2 = 'C' or tag3 = 'C') AND
(tag1 = 'D' or tag2 = 'D' or tag3 = 'D')

上記SQLでは、A,B,C,Dすべて含まれているデータしか表示されないので満たせていません

select * from table where
(tag1 = 'A' or tag2 = 'A' or tag3 = 'A') OR
(tag1 = 'B' or tag2 = 'B' or tag3 = 'B') OR
(tag1 = 'C' or tag2 = 'C' or tag3 = 'C') OR
(tag1 = 'D' or tag2 = 'D' or tag3 = 'D')

上記SQLでは、検索値に含まれてないデータまで含まれていまいます

SQLアンチパターン
そもそもテーブル設計が悪いよ!というのは同意します
N:Nであれば中間テーブルを作るべきだということはわかっていますが
タグ(自由に決定できる)という性質上、難しいので、1テーブルで行いたいと考えています

検索値
A B C D

データベースのデータ

カラムtag1tag2tag3
レコード1ABC
レコード2DBH
レコード3EFG
レコード4HIB

結果期待値

カラムtag1tag2tag3
レコード1ABC
レコード2DBH
レコード3HIB

どなたかご教授お願いいたします

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

SQL

1select * from ( 2 select * 3 , (tag1 in ('A','B','C','D'))::int 4 + (tag2 in ('A','B','C','D'))::int 5 + (tag3 in ('A','B','C','D'))::int 6 tag_hit 7 from (values 8 ('レコード1','A','B','C') 9 ,('レコード2','D','B','H') 10 ,('レコード3','E','F','G') 11 ,('レコード4','H','I','B') 12 ) as tbl(カラム,tag1,tag2,tag3) 13) step1 14where tag_hit > 0 15order by tag_hit desc

もっと簡潔には出来そうですけど

投稿2022/07/02 05:30

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TanakaJirou

2022/07/02 05:52

ありがとうございますー!!! やりたいことが出来ました!! ::int とつけると、Trueであれば1、Falseであれば0となる感じなんですね! それらを合計して、一致数を計算してる感じですね!! 助かりました大先輩!
guest

0

https://www.db-fiddle.com/
のように簡単にテストできる環境があるので、CREATE TABLE と INSERT 文を使ってテストデータを作成するところまで書いていただけると助かります。

Schema (PostgreSQL v13)

CREATE TABLE TAG_TABLE( TAG1 VARCHAR(1) , TAG2 VARCHAR(1) , TAG3 VARCHAR(1) ); INSERT INTO TAG_TABLE VALUES ('A','B','C'),('D','B','H'),('E','F','G'),('H','I','B');

Query #1

SELECT T.TAG1 , T.TAG2 , T.TAG3 FROM ( SELECT CASE WHEN 'A' IN (TAG1,TAG2,TAG3) THEN 1 WHEN 'B' IN (TAG1,TAG2,TAG3) THEN 2 WHEN 'C' IN (TAG1,TAG2,TAG3) THEN 3 WHEN 'D' IN (TAG1,TAG2,TAG3) THEN 4 ELSE 0 END RANK , T.* FROM TAG_TABLE T ) T WHERE T.RANK > 0 ORDER BY T.RANK;
tag1tag2tag3
ABC
DBH
HIB

View on DB Fiddle

投稿2022/07/02 05:50

編集2022/07/02 06:12
KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TanakaJirou

2022/07/02 05:59

SQLがテストできる、便利なサイトがあるんですね! THEN 1、THEN 2、というのがイマイチ理解できていませんが、、 RANKに一致数が入るような感じなのですね・・・。 もう少し勉強してみます、ありがとうございます!
KOZ6.0

2022/07/02 06:15 編集

sazi さんの回答見て理解しました。 一致度ってそういう意味でしたか、ではこの回答は違います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問