• 締切済み

空文字の扱いについて

Oracle⇒postgresqlへ移行を行っています。 Oracleでは [カラム名] IS NULL で空文字のデータとNULLのデータを取得できましたが、postgresqlではNULLのデータのみしか取得することができません。 一応 [カラム名] IS NULL OR [カラム名] = '' で、取得できるのですが、修正量、パフォーマンスの問題から、異なった方法を探しています。何か良い方法はありますでしょうか。 宜しくお願いします。 ---以下環境--- RedHat 3 postgresql 8.1 PHP 4.3.11 adodb pear

noname#18413
noname#18413

みんなの回答

  • nino2
  • ベストアンサー率88% (8/9)
回答No.1

NULL と 空文字はPostgresqlでは扱い方が異なったと思います。 たとえば、count 関数は NULL だとカウントしませんが 空文字だとカウントします。 このあたりを調べた上で、どのように扱うべきか考えるほうがよいか。

noname#18413
質問者

補足

ご回答ありがとうございます。 おっしゃるとおり、oracle以外のDBでは空文字とNULLは違うものとして扱われています。 また、現時点で調べた結果、adodbの「ADODB_FORCE_TYPE」に「ADODB_FORCE_NULL」を設定することで、空文字をNULLに自動変換してくれるものがあるのですが、私の環境ではコードの都合上うまく使うことができませんでした。

関連するQ&A

  • 長さ1の空文字列?

    タイトルの通り、長さ1の空文字列で困っています。 現在、Linux、Apache、MySQL、PHPを使って3階層アプリケーションを作っています。 予めMySQLでテーブルの形を決めておいて、CSVからデータを読み込ませておき、 PHPでSQL文を実行してレコードを取得することで、それらをユーザに表示という感じです。 複数あるカラムのうち、空文字列(CSV上でブランクだったもの)は表示させたくないので、 PHPで「 if(カラム=="")~ 」のように比較することで、空文字列だけ避けるつもりでした。 しかし上手くいかなかったので、strlen()で調べて見たところ、返り値が1でした。 本来は空文字列に対してstrlen()は0或いはfalseの返り値を返しますよね。 is_empty()でも空データ扱いにならず、当然NULLの扱いでもありません。 そのため、実データとの区別が出来ずに困っています。 何故、空文字列のカラムを除外したいかというと、 DB上のユニークなレコードを検索したいからです。 select * from where カラム='データ' and カラム='データ'… という風に。 「カラム=''」としてしまうと検索に引っかからなくなってしまいます。 どうすればよいでしょうか。 以下はそれぞれのバージョンです。 MySQL:5.0.95 PHP:5.1.6 Linux:RHEL5 Apache:2.2.3

    • ベストアンサー
    • PHP
  • DB2 の SQL で NULL値を空文字として取得したい。

    2つのテーブルをLEFT OUTER JOIN等によって結合した場合、値がNULLになるカラムが出てくる事がよくあります。 この場合、取得する値をnullではなく空文字(長さ0の文字列)として取得する事は可能でしょうか? IS NULL関数やNVS関数など、他のDBMSで使えた方法がエラーとしてはじかれてしまいました。何か特別なコマンドがあるのかも知れませんが、手元のマニュアルにありません。オンラインマニュアルなどがあればいいのですが、今の所見つかっていません。 どなたかご存知でしたら、教えて頂けないでしょうか。

  • Javaでoracleから抽出したデータについてnullのもの

    Javaでoracleから抽出したデータについてnullのもの タイトルの通りですが null値のデータを空文字で抽出したいのですが 現在resultsetにデータ格納して JavaはgetString("項目名")で抽出しています そうするとnull値ではなく「null」という 文字列でかえってきます stringですので当たり前かもですが 「null」ではなく「」という全く空のデータを 取得したい場合 Javaでget~で取得できるものがあれば 教えてください

    • ベストアンサー
    • Java
  • PEAR::MDB2で、データベースの各カラムの型や長さの情報を取得したい

    PEAR::MDB2でデータベース(PostgreSQL)を操作させているのですが、MDB2でデータベースの各カラムの型や長さの情報を取得することって出来ますでしょうか? フォームからデータを入力する時、フォームに入力された値の長さをチェックするのに使ったりするのに便利かとも思ったのですが、探してもそういったMDB2関数が見つかりません。 もし、各カラムの型や長さの情報を取得する方法がありましたら、教えていただければと思います。

    • 締切済み
    • PHP
  • オラクルのデータをAccessに追加 無限ループ

    前回、オラクルからデータを取り出し、Accessのテーブルに書き込みを教えて頂き、データ追加は出来たのですが、データ追加時に無限ループが発生しました。 【環境】 Oracle:10g Access:2010 Dim CON As New ADODB.Connection 'Oracle側コネクション Dim RS As ADODB.Recordset 'Oracle側レコードセット Dim SQL As String 'Oracle側SQL文 Dim i As Integer '処理用インクリメント Dim DT As Date '抽出日付変数(日付型) Dim sDT As String '抽出日付変数(テキスト型) Dim RS2 As ADODB.Recordset 'Access側レコードセット ◎現在の状況 Dim CON As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim i As Integer 'DB接続定義 CON.Open "DSN=DNS名;UID=ユーザー名;PWD=パスワード;" 'SQL文 SQL = "SELECT " SQL = SQL & "カラム1," SQL = SQL & "カラム2," SQL = SQL & "カラム3" SQL = SQL & "FROM オラクルテーブル名 " SQL = SQL & "WHERE 抽出条件 " SQL = SQL & "AND 抽出条件" SQL = SQL & "GROUP BY カラム" SET RS = CON.EXCUTE(SQL) ’取得したレコード数表示 MsgBox "オラクル側のレコード数は: " & RS.RecordCount (1)↑↑↑オラクルから、抽出したレコード数表示 rs2.Open "新しいテーブル名", CurrentProject.Connection, adOpenKeyset, adLockOptimistic rs.MoveFirst Do Until rs.EOF rs2.AddNew rs2!カラム1 = rs!カラム1 rs2!カラム2 = rs!カラム2 rs2!カラム3 = rs!カラム3 rs2.Update rs2.Close: Set rs2 = Nothing rs.close: SET RS = Nothing con.close:SET CON=Nothing end sub 上記を実行したところ、いくら待っても処理がおわらず、強制終了をかけた所、新テーブルには、約150万件追加されてました。 (1)でオラクルから抽出した、レコード数を表示させてみた所、-1でした。 ◎疑問点、 -1ってありえない数値だと思うのですが。 ちなみに、オラクル側で同様のSQLを実行させた所、取得件数は48件でした。 上記について、ご存じの方がいらっしゃいましたら、アドバイスお願いいたします。

  • テーブルの結合時に空のカラムに『NULL』を入れない方法について

    宜しくお願いします。 MySQLでleft joinでテーブルの結合を行った際に、表示に必要なカラムのみを定義した場合に、空のカラムに『NULL』が入ってしまい、絞込みで検索時にこの『NULL』が邪魔になり、きちんと検索できません。left joinでテーブルを結合する場合に空のカラムに『NULL』が入らない様にする方法はありますか? クエリ文 select a.column1,b.column2 from a left join b on a.column3 = b.column3 where column2 like '%%'; 上記の様に検索した場合、likeで曖昧検索の上、検索内容を指定していないので、全データが検索されるかと思ったのですが、テーブルbのcolumn2が空のカラムは検索されず、HIT数が減ります。このwhereは必須で、どうしても入れなければならない状況なので、空のカラムも検索する方法があると助かります。 何卒、ご教授の程、宜しくお願いします。

    • ベストアンサー
    • MySQL
  • PostgreSQLの SQL

    PostgreSQLのSQLで空文字判定する場合 =="" , <> "" , !=""ではなく IS NULLで良いのでしょうか? IS NULLは、空の場合とnullの場合の2つを判定しているのでしょうか

  • SQLServerのNULLのデータと空文字のデータを抽出する方法を教

    SQLServerのNULLのデータと空文字のデータを抽出する方法を教えてください! いつもお世話になっております。 下記のコードで、空文字とNULLのデータがないときはデータが抽出できました。 どなたかご教授お願いいたします! ==開発環境== SQLServer2000 VB6.0 =================================================== 【VB6.0】 '■リストボックスがあり、チェックが入っている場合は、NULL値を渡し、チェックが入っていない場合はチェックボックスのデータ(名称)をパラメータとして渡します。 '■ただし、リスト名の「(空)」にチェックが入っている場合はNULLと空文字(” ”)のデータを抽出しなければなりません!! If objList.Selected(lngListCnt) = True Then If objList.List(lngListCnt) = "(空)" Then '★★★ここが分かりません!!! .Parameters("@Ivch" & strArry(intCnt) & "List" & lngListCnt) = "NULL"←??? Else '■チェックが入っているものは検索対象の為、NULLを渡す .Parameters("@Ivch" & strArry(intCnt) & "List" & lngListCnt) = Null End If Else '■チェックが入っていないものは検索対象外の為、リストボックス内のデータの名称を渡す。 .Parameters("@Ivch" & strArry(intCnt) & "List" & lngListCnt) = objList.List(lngListCnt) End If ========================================= 【SQLServer2000】 CREATE Procedure … ( @IvchList0 VARCHAR(10), @IvchList1 VARCHAR(10), @IvchList2 VARCHAR(10) @Oint件数 INT OUTPUT) AS --■条件に合致する件数を取得し、返します SELECT @Oint件数 = COUNT(*) FROM TB取込 WHERE ((Aテーブル.あ列 <> @IvchList0) OR (@IvchList0 IS NULL)) AND (((Aテーブル.あ列 <> @IvchList1) OR (@IvchList1 IS NULL)) AND (((Aテーブル.あ列 <> @IvchList2) OR (@IvchList2 IS NULL)) ・ ・ ・ 以上です。よろしくお願いします!

  • 移植性のあるSQLの書き方

    現在Oracleを使用していますが、 将来他のDBに切り替える可能性もある、ということで、 移植性のあるSQLを書こうとしているのですが・・・ ある文字列フィールドの値がNULLか空文字列の場合、 という判定式で困っています。 普通のDBだと、   field IS NULL OR field <> '' と書くところですが、 Oracleの場合、空文字列=NULLなので、 上記の書き方をすると、field <> NULL という式が成り立たず、 常に偽になってしまいます。 移植性があり、且つ、パフォーマンス的にも問題のない、 なにかよい書き方ないでしょうか。。??

  • RAW型の検索判定について

    RAW(73)で定義しているカラムがあります。 例えばカラム名「RAW_DATA_01」とすると参照する時、 select dump(RAW_DATA_01,16) from ~ とすると NULLならNULL、それ以外なら Typ=23 Len=73: 4b,9,0,0.....などと表示されます。 数万レコードの検索でNULLが殆どを占めるのですが、NULL以外だけを検索する方法が分らず困っています。 表示ではNULLと出てくるのだからなんとか判断出来そうに思うのですが。 DBはOracle8i for Linuxです。良きアドバイスを!