ホーム › フォーラム › A5:SQL Mk-2掲示板 › 「SQLを1行に整形」の仕様確認
- このトピックには2件の返信、1人の参加者があり、最後にまつだにより9ヶ月前に更新されました。 
- 
		投稿者投稿
- 
		
			
				
まつだ ゲストいくつかのパターンで「SQLを1行に整形」機能を利用していたのですが、 
 いくつか想定外のパターンになったものがあったので、
 なぜそのような挙動になってるのか、お伺いしたいです。整形前 
 — (1)
 select
 test
 from
 table;
 — (2)
 select
 $test$
 from
 table;
 — (3)
 select
 :test:
 from
 table;
 — (4)
 select
 @test@
 from
 table;整形後 
 — (1)
 select test from table;
 — (2)
 select $test$ from table;
 — (3)
 select :test :from table;
 — (4)
 select @test@from table;(1)(2)のパターンだと、改行部がスペースに変換されてます。 
 (3)のパターンだと、2つ目の’:’の前にスペースが入り、その後続の改行はスペース変換なしで削除されてます。
 (4)のパターンだと、2つ目の’@’の後の改行はスペース変換なしで削除されてます。松原正和 キーマスターまつださんこんにちは。 
 
 こちらですが、(1)(2)はよいとして、問題は、(3)(4)かと思います。
 
 (3)は “:” がパラメータ前置詞として扱われたためこのように変換されたようです。
 (fromはパラメータ名としては不適ですが、ルール上パラメータとして扱われた形となります。)(4)は(3)と同様に “@” がパラメータ前置詞として使われたのですが、2個目の “@” は Oracle のデータベースリンク機能の構文として扱われたため、前後の識別子との間の空白が削除されたようです。パラメータの後ろにデータベースリンクの “@” が来ることは本来ありませんが、このような構文を想定していないため、結果的にこのようなテキストに変換されたようです。 
 
 (3)(4)は少し想定されていないSQL文であるためこのような結果になりましたが、何かこのような構文を使うことがあったのでしょうか?
 まつだ ゲスト返信ありがとうございます。 
 気にしてたのは(4)の挙動で、(3)は試してみたらそうなっただけの話になります。(3)(4)は少し想定されていないSQL文であるためこのような結果になりましたが、何かこのような構文を使うことがあったのでしょうか? 別途加工を行うことを想定してた、SQLのテンプレート文字列を準備し、 
 加工時に @test@ 部分を置換するような実装をしておりました。
 そのSQLのテンプレートを生成する際、1行化してDBレコードのカラムに格納するために、
 A5M2の「SQLを1行に整形」を利用しておりました。
 このような使い方の是非はひとまず置いといて、
 select a from table where x = @x_value@ and y = 2222;
 ↓
 select a from table where x = 1111 and y = 2222;
 という結果を期待していたのが、
 select a from table where x = @x_value@and y = 2222;
 ↓
 select a from table where x = 1111and y = 2222;
 というSQLが生成されてしまっておりました。
 かつ、厄介なのは、
 select a from table where x = 1111and y = 2222;
 というSQLが、PostgreSQL14までですと
 select a from table where x = 1111 and y = 2222;
 として正常に処理されてしまっていたのが、PostgreSQL15において
 1111andのままで処理されることとなり、エラーとなるという、挙動の違いが出た次第です。確かにOracleを想定した際の@の位置づけは理解できますので、 
 修正するしないの判断はお任せしますが、事実としてご報告いたします。
- 
		投稿者投稿
