SQLの実行で意図せぬ結果になる。
こんにちは、皆さま。
業務でIRISを用いて開発を行っている者です。
SQLの実行結果について、意図せぬ結果になるものが二点ありますので、
利用方法等に誤りがないかを確認させてください。
①
CREATE TABLE Tmp.AAA AS SELECT * FROM Mst.AAA WHERE column = ?
⇒管理ポータルで実行しても、?パラメータを置換するダイアログが表示されず、
オンコードで%Execute()しても実行エラーになる。
★この構文では?パラメータは利用できないのでしょうか?
②
SELECT * FROM Mst.AAA WHERE column IS NULL
⇒IS NULLではヒットせず、= NULLだとヒットする。
★IRISとして、IS NULLと= NULLに動作差異があるのは何故でしょうか?
すいませんが、情報をお持ちの方がいらっしゃればご教示いただけますと幸いです。
Product version: IRIS 2022.1
Ohataさん こんにちは。
①についてですが、CREATE文に対する?の引数指定がサポートされていないため、エラーになってしまうようでした。
Mihoko Iijima さん
ご確認いただきありがとうございます!
そういう事だったんですね。
インジェクション対策として、パラメータを分けることを基本方針にしていたのですが、
設計を見直す必要がありそうですね・・・。
Ohataさん、こんにちは。
②について、カラム値がNULLかどうかを判定するには、IS NULL、IS NOT NULL を使用いただく必要があります。
https://zenn.dev/indigo13love/articles/b3604502149b2f
ただ、記載いただいた結果ですと逆になっているようですが、こちらのIRIS 2022.1で試すと
IS NULL では指定したカラム値がNULLのレコードがヒットしますが、= NULLではヒットしませんでした。
Toshihiko Minamoto さん
ご確認いただきありがとうございます!
こちらでも、今問題となってるテーブルから問題のカラムを抽出して
新たなテーブルを作成し、そこに対してIS NULLで検索をかけますとヒットすることが確認できました。
テーブルのデータ件数なのか、Insertのやり方なのか、何か条件がありそうですので、
もう少し絞り込めましたら、改めてサポートに問い合わせてみようと思います。
Ohataさん、もしかして、shaCdカラムのタイプですが、埋め込みクラス(%SerialObject)で作成したクラスをタイプとして定義されていたりしますか?
テーブル定義ではなく、クラス定義として以下作成してテストしてみたら、カラム名=Null でヒットしました。
参照元クラス:Test.Person
Class Test.Person Extends %Persistent { Property Name As %String; Property Address As Address; }
埋め込みクラス:Test.Address
Class Test.Address Extends %SerialObject { Property Zip As %String; Property Pref As %String; }
(Test.PersonのAddressプロパティがTest.Addressを参照する定義)
以下のテストをしたところ、Ohataさんと同じ状況になりました(SELECTの実行ですが、管理ポータルのODBCモードとODBCクライアントで試しています)
insert into Test.Person (Name) values('テスト太郎')
select * from Test.Person where Address=NULL この結果👉.png)
select * from Test.Person where Address is NULL この結果👉 0件
違う状況でしたらすみません・・。
Mihoko Iijimaさん
ご確認いただきありがとうございます!
残念ながら、対象のカラムは普通の文字列型となります…。
もう少しこちらでも発生条件を絞り込みたいと思います。
すいません。
②について動作差異の原因がわかりました。
対象のカラムはNOT NULL制約をかけているのですが、
INSERT時にはパフォーマンス優先して%NOCHECKのオプションを付けていました。
NOT NULLのカラムにNULLが入っている時に記載したような振る舞いとなるようです。
こちらについては、私のプログラム側の問題と思いますので、対応するようにいたします。
Ohataさん、情報ありがとうございます!
NOT NULL制約のカラムはNULLが入らない前提になっているので、
NULLが入っていると、ヒットしてしまうのですね。