1

Borland Database Engine(BDE)を介してParadoxテーブルを使用しています。

文字列フィールド(Paradoxデータ型 "A")でnullおよび空の文字列値が処理される方法を理解できません。

私の特定の問題は、フィールド値がnullか空の文字列かを判断する方法です。データベースデスクトップツールでは、それらはすべて空の文字列のように見えます。

これが必要なのは、データを(データベースデスクトップを使用して、プログラムで)Firebird DBに移行し、空の文字列のように見えるフィールド値がすべてnull値としてFirebirdにコピーされるためです...インデックスに属するフィールドも!実際のnullと空の文字列を区別するにはどうすればよいですか?それはParadoxまたはBDEに依存しますか?ありがとう!

4

2 に答える 2

7

有害と見なされるNULLとしての空白

ご存知のように、最新のデータベース実装には「NULL」の概念が含まれています。これは、他のどの値とも一致しない値であり、別のNULLであっても一致しません。

BDE、およびその祖先であるParadoxエンジンとParadox for DOSには、NULLの概念は含まれていません。BDEテーブルのどのデータ型も、NULLのような除外値を許可していません。

BDEにはBLANKの概念が含まれてますが、これは一部のタイプの特別な帯域内値にすぎません。BLANKはBLANKと一致します。数値フィールドでは、BLANKは0と区別できますが、アルファフィールドでは、BLANKは長さがゼロの文字列と同じです。

どうやら薄暗い過去のある時期に、誰かがBDEテーブルからSQLデータベースにインポートするためのユーティリティを作成する任務を負いましたが、彼はそれに完全に対応していませんでした。彼はおそらくNULLなしではデータベースを思いつくことができなかったので、BLANKはNULLと同じであると推測しました。それ以来、他の誰もが彼の先導に従いました。

BDEBLANKをSQLNULLに変換するのは間違っています。これを行うと、データベースのアーキテクチャが変更され、関連するアプリケーションのアーキテクチャが破損します。BDEテーブルからインポートされたデータにNULLが含まれることはありません。

独自のインポート手順を作成するか、組み込みのインポートを使用してから、インポートしたデータを慎重に後処理して、すべてのNULLを他の値に変換します。

BLANKアルファ値は、長さがゼロのCHAR値またはVARCHAR値に変換する必要があります。

BLANK数値は、それ自体と一致する選択された帯域内フラグ値に変換する必要があります。NaNなどを機能させることができない限り、BDEBLANKを表すために特別な値を予約する必要がある場合があります。多くの場合、アプリケーションアーキテクチャによっては、BDEBLANKをSQL0に変換できます。

もちろん、SQL実装で、それ自体と一致し、NULLと区別できるBLANK数値が許可されている場合、データベースは少なくともBDEと同等の機能を備えているため、問題は軽減されます。ただし、組み込みのインポートユーティリティはまだ使用できない可能性があります。

于 2012-11-08T04:40:12.327 に答える
0

SQLの例:

select customer_id from customer
where (customer_addr is null) -- string null
   or (customer_addr = '')    -- string is empty

Delphiの例:

if (query1customer_addr.AsVariant = NULL) // string null
  or (query1customer_addr.AsString = '')  // string is empty
then ShowMessage('Null or Empty');
于 2012-04-19T14:04:03.410 に答える