「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:0
総数:2566
現在:5


クエリでのEMPTY句の動作がおかしい

ページOpenOffice.org FAQの登録ページ
投稿者maharu
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2008-07-03 16:59:40 (木)
OSWinXP
依存するページfaq/4/1167
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

初めて投稿します。よろしくお願いします。 さて、クエリの条件欄に「IS EMPTY」を指定すると空白を、「IS NOT EMPTY」を指定 すると空白ではないデータを抽出するはずだと記憶しておりましたが、バージョンを 2.4.1にしてから?だったと思いますが、「IS EMPTY」を指定するとすべてのデータが はじかれ、「IS NOT EMPTY」を指定するとすべてのデータが対象となるようになって います。 「<>=''」や「==''」を条件欄に指定するときちんと動作しますので、代替は効きますが、 なんとなく今まで使えたものが使えなくなっているのが気になって投稿してみました。

皆様の環境では大丈夫なのでしょうか?


失礼しました

maharu (2008-07-03 17:03:51 (木))

OSはWinXP SP2です。
また、「<>」「=」のうしろにシングルクォーテーションを付けたつもりで
すが、なんだか太字になってますね。
全角ですいませんが「<>’’」「=’’」です。

DBではNULLと空白は区別されます

M.Kamataki (2008-07-03 21:36:18 (木))

フィールドの属性にNULL値を許可した場合、フィールドのデフォルト値はNULLになります。データベースでは、NULLは「未定」あるいは「未登録」という意味で値のない「空白」とは区別されます。さて、このNULLの状態のところに値を入れ、さらに削除するとどうなるでしょうか。値はNULLではなく空白値になります。

したがって「IS EMPTY」はNULL値の検索、「=''」は空白値の検索と異なる意味となります。

このあたりの確認をお願いします。

;; データベースのNULL値については、以下などを参考に。
http://oracle.yobuno.com/2006/06/null.html

そうですか・・・

maharu (2008-07-04 08:58:53 (金))

早速のレスありがとうございます。
ACCESSでは 「IS NULL」で空白値も抽出され、確かBaseでも以前のバージョンは「IS EMPTY」で空白値も抽出されたような気がしていたので、「不具合」で登録していたんですが…。わたしのきおくちがいだったんでしょうか?

調べ中ですが

M.Kamataki (2008-07-04 17:58:02 (金))

OpenOffice.org 2.4.1で作成したサンプルを添付します。
filefaq4_1128_1.odb

>さて、このNULLの状態のところに値を入れ、さらに削除すると
>どうなるでしょうか。値はNULLではなく空白値になります。

Baseの標準DBであるHSQLDBでは異なる結果になってしまいました。検証の結果、値を入れたフィールドを削除すると、またNULLが設定されました。faq4_1128_1.odbのis_empty1クエリーを実行すると、ID=2のレコードのtestフィールドもNULL値として検索されます。このフィールドは、値を設定後削除しています。

「=''」で検索できるということは、長さが0の値がフィールドに格納されているということですが、わたしのサンプルでは確認できません。しかし、IssueTrackerにはこの問題が再現するサンプルがありました。次のIssueです。

Textbox controls ignore "Empty string is NULL" property when field is required :
http://ja.openoffice.org/issues/show_bug.cgi?id=90403

サンプルは、TestErrorBox.odbという名前で登録されています。qry_str_lenthsクエリーを実行すると、長さが0のフィールド値がわかります。どうやらフォームからの入力に問題があるようです。maharuさんは心当たりはありませんか。

なお、もしmaharuさんも問題を再現できるサンプルを作成可能でしたら、ご検討ください。

横レスで申し訳ないです。

ponkan (2008-07-04 18:41:34 (金))

別件でNULLの値を調べたりしてたのですが
バイナリエディタ等で確認した所、&H3Fになっているようで
意図するものと違うように感じたりしてます。本当は&H00が好きなんですけど。

外れたかな?

&H3F は 半角文字 ? だから、、、

Tora (2008-07-05 18:03:38 (土))

&H3F は 半角文字 ? ですよね。

1. xxxx.odb というファイル名を xxxx.odb.zip などに変更し、
2. Windows XP などであれば、その .zip ファイルをダブルクリックして中身を見れるようにし、Windows 2000 などであれば、WinZip などのツールなどでその .zip ファイルを展開し、

.
|-- Configurations2
|-- META-INF
|   `-- manifest.xml
|-- content.xml
|-- database
|   |-- backup
|   |-- data
|   |-- log
|   |-- properties
|   `-- script
|-- mimetype
`-- settings.xml

3. database フォルダ内の data の中身を見てみる。

といっても、data の中身は、期待しているような純粋なデータだけを示しているようではなくて、HSQLDB のメモリー上での作業領域の内容をそっくりダンプしただけのようでして、そこに何があったから、どうだこうだ、とは言い切れないような気がいたします。
そのような、作業領域のダンプデータを見て判断しようとするよりは、仕様書を見たほうがよいのではないかなぁ。と思います。

ユーザーガイド
http://hsqldb.sourceforge.net/doc/guide/index.html

Base の 「ツール」「SQL」を使って、HSQLDB 特有?の shutdown コマンドを使うと、ファイル内に書き出される内容をある程度、好みのようにできるようになっています。もしご興味があれば、お試しあれ。

SHUTDOWN
http://hsqldb.org/doc/guide/ch09.html#shutdown-section

仕様変更かも

Tora (2008-07-05 18:18:49 (土))


ソフトウェアエンジニアの一人としての感想としては、

『なんとなく今まで使えたものが使えなくなっている』

については、今回の場合は HSQLDB の開発者が(OpenOffice.orgの開発者ではなく)、そうなってしまうことを承知で、別の側面についての機能強化・標準的な規格への準拠などを行ったということかもしれないのかなぁ。とも感じられます。

つまり、今までできていたというのは、たまたまであって、規格に照らし合わせてみると、誤った動きだった。と。

たぶんお気づきの通り、他社の出回っているソフトウェア製品ではその製品独自の仕様で実装されていて、その仕様は標準的な動作とは異なっていることがあったりすることがありますよね。
今回も、それに近いのではないかなぁ。と思ったりもいたします。

じゃぁ、どうすればいいの? 独自な仕様は便利だったかもしれませんが、今後は標準的な仕様に沿って、使いましょ。ってことで。

Google などで検索してみると、
= NULL
というような判定方法は、すでに古く、新しくは
IS NULL
というように使うんだよ。というようなページも見つかりますです。

まあ、今回は、そのおかげで困ってしまったわけですよね。とはいっても、やりたかったことが新しい方法でまったく出来なくなったはずはなくて、別の表記方法をすればうまく動作するのではないかと思います。ちょいと無責任な発言ですみませんです。

いままでできたのにできなくなった。というのは、たいていの場合、以下のどちらかであって、
(a) バグ
(b) 意図した仕様変更

確か、ここ数ヶ月の間でしたが、OpenOffice.org の Base で採用している HSQLDB のバージョンを新しいのに差し替えるよ。というような連絡事項が開発側のメーリングリスト上で投稿されていたようなうすら記憶がありますです。
で、今回は、(b)なのではないかなぁ。と感じた次第であります。

長さが0の値を入力可能にする

M.Kamataki (2008-07-06 10:39:30 (日))

のは、フォームの機能で変更可能でした。テクストボックスコントロールの設定で「空白の文字列はゼロとみなす(英語表記はEmpty string is NULL)」を「いいえ」とすると設定できました(下図参照)。

faq4_1128_1.png

長さが0の値を入力可能にしたサンプルです。

filefaq4_1128_2.odb

このサンプルを2.0.4、2.2.1、2.4.1で確認してみましたが、is_empty1クエリーの結果、および長さが0の検索と長さを表示するlength_test1クエリーの結果はいずれも一致しました。

つまり、フォームの機能で「空白の文字列はゼロとみなす」を「いいえ」としない限り、テーブルに長さが0の値を入力することは不可能といえるのではないでしょうか。また、「IS EMPTY」でNULLと長さが0、両方の値を検索できる、という結果は確認できませんでした。

いちおう、「DBではNULLと空白は区別されます」と書いたわたしのコメントはBaseとHSQLDBの組み合わせでも確認できたと言えると思います。どうでしょうか。

Toraさん、NULLと長さが0(空白)の値については、各バージョン間で仕様の変更はないと、わたしは思います。もし、わたしが未検証のバージョンで問題があったとすれば、不具合でしょうが、最新バージョンでは問題ない、ということになると思います。

;; NULLを「ゼロ」としている翻訳は問題かも

Accessの場合

M.Kamataki (2008-07-06 10:46:32 (日))

テーブルの設定で長さが0(空白)の値を入力可能にするなどの設定ができるようです。以下のURL参照。

http://blog.goo.ne.jp/office_y/e/6b1b652c7511e616944261a49cd48b45

テーブルデータ

maharu (2008-07-07 09:03:06 (月))

いろいろな話に展開していっているようで、びっくりしています。
さて、私が使用して問題提起させていただいているDBの環境ですが、なんの
ことはない、表計算ドキュメントを取り込んだものです。

手順としては、
1.excelで入力
2.データをcalcにコピー&ペースト(excelのままbaseに接続するとデータ
  が消失してしまうレコードがあった)
3.baseの表計算ドキュメントで当該calcファイルに接続
4.このままだと読み取り専用なので、テーブルコピーを使用してbaseの
  テーブルとして取り込む。

以上のテーブルに対し、クエリを実行しています。フォームの利用は一切
ありません。
皆様のアドバイスからすると、私のようにして取り込んだ表計算ドキュメ
ントは、表計算自体では未入力セルであったとしても、取り込んだ時点で長
さゼロのデータが入っているものとして取り込まれるのかな?と解釈できま
した。

それはそれで別にかまわないのですが…。

やはり、2.4.0では上記のようなテーブルでも「IS EMPTY」で検索出来ていた
ようです。過去に私が作成したクエリでも同様のテーブルで「IS EMPTY」で
検索していましたので。

以前のテーブルと今回問題になったテーブルの違いは、calcを介さずに直接Excelファイルに接続して、テーブルコピーを行ったことくらいでしょうか?

仕事の関係上サンプルDBなどを作成する時間があまりなく、またbaseも初心者ですので、皆様にはご迷惑をおかけしますが、よろしくお願いします。

サンプルでご確認を

M.Kamataki (2008-07-07 11:19:21 (月))

>やはり、2.4.0では上記のようなテーブルでも「IS EMPTY」で検索出来ていた
>ようです。過去に私が作成したクエリでも同様のテーブルで「IS EMPTY」で
>検索していましたので。

2.4.0の環境は残っているでしょうか。わたしは、先ほど2.4.0でも当ページに添付したfaq4_1128_2.odbファイルで確認してみましたが、「IS EMPTY」で検索できるのは、is_empty1クエリーの結果を見る限り、NULL値だけです。

なお、わたしが検証したのは、Base+HSQLDBの環境です。Baseのステータスバーに「HSQLデータベースエンジン」と表示されているはずです。HSQLDB以外のデータベースを利用している場合は、仕様はそのデータベースに依存します。この点も注意してください。

ただ、Calcのデータベース範囲をインポートしたテーブルは未検証なので、これからチェックしてみます。

Calcからインポートしたテーブル

M.Kamataki (2008-07-07 22:22:05 (月))

以下のサンプルは、OpenOffice.org 2.4.0で作成したものです。
filefaq4_1128_240.odb

では、2種類の方法でCalcのシートのデータベース範囲をBase+HTMLDBのテーブルにコピーしてみました。null_test1テーブルは、下図のようにCalc上でデータベース範囲をコピーして、Baseのテーブルカテゴリで貼り付けたものです。

faq4_1128_2.png

結果的に、Calc上で入力値がないフィールドはNULLとなりました。また、作成後のテーブルで値を入力後、削除するとデフォルトのNULLとなります。

null_test2テーブルは、CalcファイルをBaseに登録しデータベースとして扱えるようにし、「表1」テーブルからコピーしたものです。結果的に、Calc上で入力値がないフィールドは文字列の長さが0の値になっていました。しかし、null_test2テーブルのID=3のtestフィールドのように、値を入力後、削除するとデフォルトのNULLとなります。is_empty2クエリー、kength_test2クエリーの結果を見ると、「IS EMPTY」でNULL値も文字列の長さが0の値も検索できるというご報告は確認できません。

このサンプルを2.4.1でも試してみましたが、2.4.0と動作に違いはありません。他の方はどうでしょうか。

ありがとうございます

maharu (2008-07-08 09:02:44 (火))

なるほど、やはりcalcからのテーブルコピーは未入力セルが長さゼロの値として取り扱われるわけですね。ありがとうございます。

話変わりまして、もしかして?と思ったことですが

以前EMPTYで検索出来たときのバージョンは2.4.0でしたが、もしかして
baseの検索条件自体の変更はなかったと考えると

以前と今回の違いは、「baseへの表計算ドキュメントの接続」ではないかと。

以前は、Excelシートに接続してテーブルコピー、今回はcalcの表に接続
してテーブルコピーしています。

もしかして、Excelとcalcでは未入力セルの取り扱いが違うのでは…?

聞いてばっかりですいませんが、よろしくご検討お願いします。

こちらでも時間を見て試してみたいと思います。

とりあえず完了にさせていただいていいでしょうか?

maharu (2008-07-18 16:16:32 (金))

すみません。私が完了にするべきかわかりません(もしかして管理者様が変更するもの?)が、議論も終了したようですし、勝手に完了にさせていただきます。ありがとうございました。

完了の件

M.Kamataki (2008-07-20 15:04:39 (日))

ありがとうございます。質問された方が完了していただいてもかまいません。

なお、翻訳の件は当質問ページをわかりやすくするため、別質問(faq/4/1167)にしました。また「不具合」は「Q&A」に変更しました。

お名前:
題名:


添付ファイル: filefaq4_1128_2.png 530件 [詳細] filefaq4_1128_240.odb 1262件 [詳細] filefaq4_1128_2.odb 1252件 [詳細] filefaq4_1128_1.png 553件 [詳細] filefaq4_1128_1.odb 1274件 [詳細]