アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のSQLで想定のレコードが取得できず0件になります。
副問い合わせ側SQLが「'111','333','222'」といった具合に文字列が取得できるのは確認できています。
※文字列編集の''''のところが合ってるかどうか訳あって微妙ですが、このような形だったはずです。
SELECT * FROM AAA WHERE NO IN
(REPLACE(REPLACE(
(SELECT NO FROM BBB)
,'NO',''''),'NO','''' + ',') + '''' + '222' + ''''
FOR XML PATH('')
)
試しに以下を実行すると想定通りデータが引きあたり3件データが出るといった具合です。
SELECT * FROM AAA WHERE NO IN ('111','333','222')

FOR XML PATH('')ではこのような形はできないんでしょうか?

またin句やexistsでも良いのですが、上記形式でできない理由が釈然とせず質問させてください。

よろしくお願いいたします。

A 回答 (2件)

> 副問い合わせ側SQLが「'111','333','222'」といった具合に文字列が取得できるのは確認できています。



これは「『'111','333','222'』という1つの文字列」なのであって、「'111','333','222'という3つの文字列」ではありません。
SQLで直接書くなら
SELECT * FROM AAA WHERE NO IN ( '''111'',''333'',''222''')
SELECT * FROM AAA WHERE NO = '''111'',''333'',''222'''
と同等ということになります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。度重ね質問すみません。
以下の場合に修正した場合、
SELECT * FROM AAA WHERE NO IN
(REPLACE(REPLACE(
(SELECT NO FROM BBB)
,'NO',''),'NO','' + ',') + '' + '222' + ''
FOR XML PATH('')
)
↓これと同等でしょうか?一つ目の'はエスケープシーケンスで2つ目は'そのものと思っています。これなら想定結果が望めますでしょうか?
SELECT * FROM AAA WHERE NO IN ( '111','333','222')
SELECT * FROM AAA WHERE NO = '111','333','222'

お礼日時:2020/02/11 22:17

FOR XML PATH は「一つの文字列」にまとめる、というものです。


それをREPLACEで加工しても「一つの文字列」であることに変わりはありません。
文字列の中がカンマで区切られていても「カンマを含んだ一つの文字列」でしかありません。

今のSQLでは、REPLACEで加工したところで
SELECT * FROM AAA WHERE NO IN ( 一つの文字列 )
 という形は変化しません。IN の候補が一つだけなので、
SELECT * FROM AAA WHERE NO = 一つの文字列
 と同等です。
    • good
    • 0
この回答へのお礼

よく分かりました。ありがとうございます。

お礼日時:2020/02/12 23:21

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