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

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

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

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

Q&A

解決済

3回答

7228閲覧

Postgresqlのlike演算子にて、サブクエリを指定

whimyama

総合スコア9

PostgreSQL

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

0グッド

0クリップ

投稿2019/06/10 02:45

編集2019/06/10 02:52

psqlのlike演算子にて、以下のようなサブクエリを指定する事は可能でしょうか?
このまま実行するとエラーになります。(ERROR: syntax error)

PostgreSQL

1where 名称 like '%( 2select case 3when to_char(to_date('20190601','yyyymmdd') ,'D')='2' then '月' 4when to_char(to_date('20190601','yyyymmdd') ,'D')='3' then '火' 5when to_char(to_date('20190601','yyyymmdd') ,'D')='4' then '水' 6when to_char(to_date('20190601','yyyymmdd') ,'D')='5' then '木' 7when to_char(to_date('20190601','yyyymmdd') ,'D')='6' then '金' 8when to_char(to_date('20190601','yyyymmdd') ,'D')='7' then '土' 9end 10)%'

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

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

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

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

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

whimyama

2019/06/10 02:53

失礼しました。修正をしました。
guest

回答3

0

ベストアンサー

この場合だと、サブクエリの中身は定数ですので、where 名称 like '%土%';ということになります(クエリを呼ぶ側で計算すればいいでしょう)。


テーブルを引くなどで、SQLで生成する必要がある場合、サブクエリで生成した文字列と両端の%CONCATする必要があるかと思います。

SQL

1WHERE 名称 LIKE CONCAT( 2'%', 3(SELECT 後略), 4'%' 5)

投稿2019/06/10 02:56

maisumakun

総合スコア146530

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

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

whimyama

2019/06/10 08:36

解消しました!ありがとうございました。
guest

0

おそらく'の中に'を書いてしまっているのところ(つまり文字列なら本来はエスケープ対象)と、
''内にそのまま書かれているので文字列として扱われてSQLとして実行されるわけではなくなるので
本来やりたい「SELECT結果を利用」するための文字連結になっていないところですね。

一度'で切り||で文字連結して試してみてください。

sql

1where 名称 like '%'||( 2select case 3when to_char(to_date('20190601','yyyymmdd') ,'D')='2' then '月' 4when to_char(to_date('20190601','yyyymmdd') ,'D')='3' then '火' 5when to_char(to_date('20190601','yyyymmdd') ,'D')='4' then '水' 6when to_char(to_date('20190601','yyyymmdd') ,'D')='5' then '木' 7when to_char(to_date('20190601','yyyymmdd') ,'D')='6' then '金' 8when to_char(to_date('20190601','yyyymmdd') ,'D')='7' then '土' 9end 10)||'%'

※私の手元で確認した限りエラーはでなくなりましたが、想定通りの情報が取得できるかどうかは別問題です。


蛇足。
サブクエリをwhere句に利用するとかなり読みづらくなるので
withを利用して見通しが良いSQLにしたほうが分かりやすくなるかもしれません。
問題の切り分けもしやすくなります。

投稿2019/06/10 02:54

編集2019/06/10 04:00
m.ts10806

総合スコア80888

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

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

whimyama

2019/06/10 08:36

解消しました!ありがとうございました。
guest

0

解決済みですけど、以下で同様な抽出ができます。
※そもそも質問でサブクエリーと言われてますが、case文の部分にselectは不要です。

SQL

1where 名称 like to_char(to_date('20190601','yyyymmdd'), '%TMDy%')

9.8. データ型書式設定関数

TM接頭辞 翻訳モード(lc_timeに基づき、現地語化された曜日、月名を表示します)
DY 短縮形の大文字での短縮形の曜日名(英語では3文字。現地語化された場合は可変長)

投稿2019/06/10 12:16

編集2019/06/10 14:30
sazi

総合スコア25426

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問