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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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回答

5773閲覧

SQL(PostgreSQL) 部分一致の複数抽出方法

vidal

総合スコア2

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クリップ

投稿2021/10/14 01:31

前提・実現したいこと

SQL(PostgreSQL) で部分一致を複数抽出したいと思ってます。
小数の抽出であれば、「like % and %」で繋げればいいかと思うのですが、
多数の抽出をする場合の方法をご教示いただければと思います。
(「like in (
%,
%)」で試してみましたがエラーになってしまい。)

試したこと

select *
from df
where df.カラム名 like in ('16%','17%','21%','27%','28%','33%','34%','36%','40%','41%','43%','45%','48%',
'50%','52%','53%','54%','55%','59%','61%','63%','67%','68%','70%','71%','72%','73%','74%',
'80%','81%','83%','85%','86%','87%','88%','89%','92%','93%','94%','97%')

補足情報(FW/ツールのバージョンなど)

以下使用環境になります。
・PostgreSQL
・DBeaver21.1.1
・Windows10

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

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

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

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

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

guest

回答2

0

ANYもしくはSOMEを利用するとよいと思います。

SQL

1SELECT * 2FROM EXAMPLE 3WHERE COL1 LIKE ANY (ARRAY['12%', '45%', '78%']);

投稿2021/10/14 02:43

neko_the_shadow

総合スコア2349

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

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

0

ベストアンサー

like演算子では1文字毎のor表現は可能ですが、2文字の組み合わせのor表現は出来ません。
追記:他の方の回答のようにパターンを複数というのは可能ですね

先頭2桁との比較であればin述語が使用できます。

SQL

1select * 2from df 3where substr(カラム名, 1, 2) in ('16','17',・・・, '92','93','94','97')

但し、対象項目にインデックスが設定されている場合、likeの場合は前方一致でインデックスが使用されますが、先頭2桁との比較だと、式インデックスを追加しないとレスポンスは劣化します。

条件が正規表現でパターン化できるなら、SIMILAR TO正規表現を使うと記述は簡潔にはなりますが、インデックスには期待できません。

追記

以下の様にパターンを独立した集合のように扱うとメンテしやすくなります。
条件がパラメータなら、with式で展開している部分を一時テーブルにする事でも対応できますね。

with ptrn as ( select * from unnest(array[ '16%','17%','21%','27%','28%','33%','34%','36%','40%','41%','43%','45%','48%' ,'50%','52%','53%','54%','55%','59%','61%','63%','67%','68%' ,'70%','71%','72%','73%','74%','80%','81%','83%','85%','86%','87%','88%','89%' ,'92%','93%','94%','97%' ]::text[]) as w(val) ) select * from df where カラム名 like any(select val from ptrn)

投稿2021/10/14 01:47

編集2021/10/14 03:04
sazi

総合スコア25327

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

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

vidal

2021/10/14 02:17

ありがとうございます。 ちなみに先頭3桁を抽出するとなる場合は以下の式で抽出できるものでしょうか? --- select * from df where substr(カラム名, 1, 2, 3) in ('161','171',・・・, '921','931','941','971') ---
sazi

2021/10/14 02:23

substrの定義は以下です。 https://www.postgresql.jp/document/13/html/functions-string.html substr ( string text, start integer [, count integer ] ) なので、先頭から3桁なら、substr(カラム名, 1, 3) です。 ※見たことのない関数などはリファレンスで確認する習慣を付けて下さい。
vidal

2021/10/14 02:46

ご教示いただきありがとうございます。 また今後確認する習慣も付けたいと思います。(アドバイスいただきありがとうございます。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問