ホーム › フォーラム › A5:SQL Mk-2掲示板 › 「SQLを1行に整形」の仕様確認
- このトピックには2件の返信、1人の参加者があり、最後に
まつだにより2週、 6日前に更新されました。
-
投稿者投稿
-
まつだ
ゲストいくつかのパターンで「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を想定した際の@の位置づけは理解できますので、
修正するしないの判断はお任せしますが、事実としてご報告いたします。 -
投稿者投稿