許せない心理テスト

SQLの書き方について、お知恵を拝借致したくお願い致します。

Oracleで副問合せの結果を選択条件にする場合、WHERE 列名 IN (副問合せの結果)
と書きますが、その結果をワイルドカードとして取り扱う方法は無いでしょうか?

例えば、
CD
--------
101
10101
10102
201
20101
とある時に、
CD
--------
10101
10102
を抽出したい場合、

SELECT CD FROM SOSHIKI WHERE CD IN
(SELECT CD||'%' FROM SOSHIKI WHERE CD LIKE '1__')

というように、SQLを書くことは出来ないでしょうか?

(注)他の選択条件とマージする必要があるので、単純に
SELECT CD FROM SOSHIKI WHERE CD LIKE '1_____';
と書くことは出来ないことが前提です。

質問者からの補足コメント

  • 試行錯誤のうえ、
    SELECT * FROM SOSHIKI as t1 WHERE EXISTS(
    SELECT CD||'%' as CD2 FROM SOSHIKI WHERE CD LIKE '1__'
    AND t1.cd LIKE CD||'%'
    )
    で通りました。
    これで問題ないのか、よく検証してみます。
    どうも有難うございました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/03/15 10:02

A 回答 (2件)

EXISTSでいけませんかね?



SELECT * FROM SOSHIKI as t1 WHERE EXISTS(
SELECT CD||'%' as CD2 FROM SOSHIKI WHERE CD LIKE '1__'
GROUP BY CD HAVING t1.cd LIKE CD2
)
この回答への補足あり
    • good
    • 0
この回答へのお礼

yambejpさん、コメント頂きましてどうも有難うございました。

不勉強なもので、この構文をはっきり理解できてないのですが、機械的に当てはめてみたところ、LIKEの後ろに自分自身で定義した別名は書けないようで、無効な識別子というエラーが出てしまいます。

お礼日時:2018/03/15 09:14

Oracleだと無理ですかねぇ、mysqlなら行けたんですが。


(mysqlの場合はconcatの文法がちがいますが)
ちなみにgroup byではなくサブクエリでもダメでしょうか?

SELECT * FROM SOSHIKI as t1 WHERE EXISTS(
SELECT 1 FROM(
SELECT CD||'%' as CD2 FROM SOSHIKI WHERE CD LIKE '1__'
) AS t2 WHERE t1.cd LIKE t2.CD2
)
    • good
    • 1
この回答へのお礼

有難うございました。
SELECT * FROM SOSHIKI as t1 WHERE EXISTS(
SELECT CD||'%' as CD2 FROM SOSHIKI WHERE CD LIKE '1__'
AND t1.cd LIKE CD||'%'
)
で通りました。
これで問題ないのか、よく検証してみます。
どうも有難うございました。

お礼日時:2018/03/15 10:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報