|
kabe
(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;
|
|
|
|
Hidemi Oya
(08/09/05 23:25)
|
|
|
|
ACFinder の公式サイトに、修正版のテンプレートを公開しました。
|
|
|
|
|
|
>Hidemi Oyaさん
kabe です。
早速、対応ありがとうございます。
> 報告ありがとうございます。当時とデータ構造が変わって、各フィールドに NULL データが存在するようになったのが、原因のようです。
あ〜、そういうことですか。
確かに Excelデータから作成した場合は、大丈夫ですね。
Excelデータの方も空文字列をNULLに置換えてデータ更新するよう統一した方がいいのかな。
データ更新時間はさらにかかりますが。
|
|
|
|
Hidemi Oya
(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 関数に問題がありそうですが、まだ原因を特定できてません。
|
|
|
|
Hidemi Oya
(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つだけとし、複数使用する場合は || 演算子で結合するようにしてください。
|
|
|
|
 |
 |