Laboratory of Mobile Agricultural Chemicals Searcher
携帯農薬検索実験室

研究会

  ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索  
29 / 114 ツリー <前へ | 次へ>

〔832〕定型処理テンプレート不具合 kabe (08/09/05 21:01)
〔833〕Re:定型処理テンプレート不具合 Hidemi Oya (08/09/05 23:12)
〔834〕修正版テンプレート公開 Hidemi Oya (08/09/05 23:25)
〔835〕Re:定型処理テンプレート不具合 kabe (08/09/06 7:46)
〔836〕Re:定型処理テンプレート不具合 Hidemi Oya (08/09/06 18:11)
〔839〕CONCAT スカラー関数のバグ Hidemi Oya (08/09/06 21:55)

〔832〕定型処理テンプレート不具合
 kabe WEB  (08/09/05 21:01)

引用なし
   kabe です。

複数作物農薬病害虫対応一覧 (2007/07/02版)ですが、正常に動作していないようです。
夏野菜殺虫剤.arg を読み込んで検索すると、作物名のフィールドが表示されません。
また例えば、カリフラワーとチンゲンサイを指定して検索すると、検索結果なしになります。最初のテンポラリテーブルを作る際に検索はできているのですが、作物名のフィールドができないせいでしょうか?

関連あるのかどうか、わかりませんが、
concat を連続して使ってフィールドを指定した場合の結果もおかしいです。

SELECT DISTINCT
 yoto,
 zaikei,
 tsusho,
 sakumotsu,
 CONCAT(', ', seibun1, seibun2, seibun3, seibun4, seibun5) AS 有効成分,
 CONCAT(', ', jiki,hoho ) AS 時期方法
FROM tekiyo
WHERE
 yoto IN ('殺虫剤','殺虫殺菌剤') AND
 idsaku IN (
  SELECT idsaku FROM m_sakumotsu
  WHERE sakumotsu REGEXP '(^|、|\()(カリフラワー|チンゲンサイ)(\)|、|$)'
 )
GROUP BY meisho;

では最初の有効成分フィールドに時期方法のデータが表示されます。

これだと正常です。
SELECT DISTINCT
 yoto,
 zaikei,
 tsusho,
 sakumotsu,
 CONCAT(', ', seibun1, seibun2, seibun3, seibun4, seibun5) AS 有効成分,
 jiki,
 hoho
FROM tekiyo
WHERE
 yoto IN ('殺虫剤','殺虫殺菌剤') AND
 idsaku IN (
  SELECT idsaku FROM m_sakumotsu
  WHERE sakumotsu REGEXP '(^|、|\()(カリフラワー|チンゲンサイ)(\)|、|$)'
 )
GROUP BY meisho;

〔833〕Re:定型処理テンプレート不具合
 Hidemi Oya WEB  (08/09/05 23:12)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

>複数作物農薬病害虫対応一覧 (2007/07/02版)ですが、正常に動作していないようです。
 報告ありがとうございます。当時とデータ構造が変わって、各フィールドに NULL データが存在するようになったのが、原因のようです。
>CONCAT(', ', CASE WHEN sakumotsu REGEXP [%sakumotsu%] ....
の行にある
>THEN byochu||mokuteki ELSE
の部分を
THEN IFNULL(byochu, '')||IFNULL(mokuteki,'') ELSE
に修正すれば OK でした。

>関連あるのかどうか、わかりませんが、
>concat を連続して使ってフィールドを指定した場合の結果もおかしいです。
 これについても同様で、
> CONCAT(', ', jiki,hoho ) AS 時期方法
の部分を
CONCAT(', ', IFNULL(jiki, ''), IFNULL(hoho,''))
にしてやれば大丈夫だと思います。
 ただ、CONCAT 関数については文字列しか扱わないので、いちいち IFNULL を入れなくても良いように、NULL データの場合は空文字列として扱うように仕様変更した方が良さそうですね。しばらくお待ちください。

〔834〕修正版テンプレート公開
 Hidemi Oya WEB  (08/09/05 23:25)

引用なし
   ACFinder の公式サイトに、修正版のテンプレートを公開しました。

〔835〕Re:定型処理テンプレート不具合
 kabe  (08/09/06 7:46)

引用なし
   >Hidemi Oyaさん

kabe です。
早速、対応ありがとうございます。

> 報告ありがとうございます。当時とデータ構造が変わって、各フィールドに NULL データが存在するようになったのが、原因のようです。
あ〜、そういうことですか。
確かに Excelデータから作成した場合は、大丈夫ですね。
Excelデータの方も空文字列をNULLに置換えてデータ更新するよう統一した方がいいのかな。
データ更新時間はさらにかかりますが。

〔836〕Re:定型処理テンプレート不具合
 Hidemi Oya WEB  (08/09/06 18:11)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

> ただ、CONCAT 関数については文字列しか扱わないので、いちいち IFNULL を入れなくても良いように、NULL データの場合は空文字列として扱うように仕様変更した方が良さそうですね。しばらくお待ちください。
 ソースを確認したら、すでにこのような仕様になってました。

 このため、
> これについても同様で、
>> CONCAT(', ', jiki,hoho ) AS 時期方法
>の部分を
>CONCAT(', ', IFNULL(jiki, ''), IFNULL(hoho,''))
>にしてやれば大丈夫だと思います。
については、この修正を行っても結果は同じです。CONCAT を使わず、
IFNULL(jiki, '')||','||IFNULL(hoho, '') AS 時期方法
とすれば OK なので、CONCAT 関数に問題がありそうですが、まだ原因を特定できてません。

〔839〕CONCAT スカラー関数のバグ
 Hidemi Oya WEB  (08/09/06 21:55)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 よくよく確認してみたら、1つのクエリー内に CONCAT 集約関数が複数あっても正常に動作しています。なのに、1つのクエリー内に CONCAT スカラー関数が複数存在すると動作がおかしくなる。しかも、複数の結果が最後の結果の値と同じになるということは、結果の値そのものが返るのではなく、値へのポインタが返っているらしい…。
 SQLite へテキスト値を返すときのデストラクタが SQLITE_STATIC と SQLITE_TRANSIENT の2種類があり、集約関数のように SQLite 側で動的に確保したメモリを使用するときは SQLITE_TRANSIENT、スカラー関数のように自分で静的に確保したメモリを使用するときは SQLITE_STATIC だと思ってたんですが、どうもこれが間違いでした。SQLITE_STATIC では結果の値へのポインタが渡され、SQLITE_TRANSIENT では結果の値そのものをコピーが渡されるということのようです。

 ってことで、CONCAT スカラー関数でも SQLITE_TRANSIENT で結果を返すようにしたら、想定どおりの動作をするようになりました。修正版をメールで送りますので、次のバージョンアップの際にお使いください。
 当面は、1クエリー内で使用する CONCAT スカラー関数は1つだけとし、複数使用する場合は || 演算子で結合するようにしてください。

  ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索  
29 / 114 ツリー <前へ | 次へ>
ページ:  ┃  記事番号:   
(SS)C-BOARD vv3.8 is Free.