過去の桐井戸端BBS (桐ver.8)
11976 外部データベースの絞り込み条件 Ogo 2001/06/28-20:03
外部データベースの絞り込み条件について質問です。

外部データベースの絞り込み条件には ODBC 関数を使う必要があって、桐の計算式が大幅に制限されてしまいます。

で、ここに条件式を放り込みたいのです。

具体的には、

#条件選択(&STR=#未定義,*,1,*&STR)

&STR が null なら全て、何かが入っている場合は先頭一致で合致するレコードのみを取り出したい――という主旨です。

さて、これを実現する記述は如何?
お判りの方、よろしくお願いします。

11979 Re:外部データベースの絞り込み条件 hidetake 2001/06/28-22:45
記事番号11976へのコメント
#DSQL("[hogehoge] Like &STR + '%'")

では?

11982 Re:外部データベースの絞り込み条件 Ogo 2001/06/29-06:38
記事番号11979へのコメント
>#DSQL("[hogehoge] Like &STR + '%'")
>
>では?

確認してみます。 (^^)

11985 Re:外部データベースの絞り込み条件 masa 2001/06/29-09:04
記事番号11976へのコメント
Ogoさん こんにちは

>#条件選択(&STR=#未定義,*,1,*&STR)
>
>&STR が null なら全て、何かが入っている場合は先頭一致で
>合致するレコードのみを取り出したい――という主旨です。
>
について
関係ない事で揚げ足を取るみたいですみません。
先頭一致は  &STR* ではないでしょうか?

間違いでしたらすみません。(そういうふうに覚えていたので)

11987 Re:外部データベースの絞り込み条件 Ogo 2001/06/29-09:25
記事番号11985へのコメント

>関係ない事で揚げ足を取るみたいですみません。
>先頭一致は  &STR* ではないでしょうか?

(^^;; その通りですね。

11988 Re:回答ではないのですが HERB 2001/06/29-10:31
記事番号11976へのコメント
Ogoさん、こんにちはHERBです。

ご質問の回答ではないのですが。

>外部データベースの絞り込み条件には ODBC 関数を使う必要が
>あって、桐の計算式が大幅に制限されてしまいます。

私も仕事でSQLサーバーから桐にデータを取り込み利用しています、
桐の関数と同じ感覚で使える関数が少なく、絞り込みなど苦慮しております、
日時型データから年、月、日を数値で取り出すにも#年・月は使えるのに
#日だとエラーを返します、SQL言語なり、アクセス関数をつかえばできることもあり、
仕方なくアクセス解説本を買って、いくつかの関数を調べたりもしました、
桐ユーザーとしてはできるなら桐関数で完結したいです、次期バージョンV9ではこのあたりも見直されるのでしょうか、
外部データも桐関数と同じ処理ができれば使いやすくなります。

一桐ユーザーの要望でした。

11998 Re:外部データベースの絞り込み条件 Ogo 2001/06/29-15:08
記事番号11982へのコメント

>#DSQL("[hogehoge] Like &STR + '%'")

ちょっと質問。

この場合、ミソは '%' ということになるのだと思いますが、
ワイルドカード % は ANSI SQL の表記で、 Jet SQL では
* と表記される内容と同一だと思うのですが。

で、言わんとすることは、桐の外部データベース操作の場合、
* でワイルドカードの役目を果たしています( Jet でなく、MS-SQL サーバーにおいても)。
ところが、 &STR* という記述の場合、 &STR がヌルの場合、対象項目値がヌル値である時に、選択データから漏れてしまうのです。

しかも *&STR* に至っては、 &STR がヌルの場合にはエラーになってしまったと記憶します。

この仕様自体に何かバグじみたものを感じるのですが、
これ、#DSQL を使って同内容の上記記述ではこの問題が解消されるのだろうか……

# 急いで試してみる必要があるけど……

11999 Re:外部データベースの絞り込み条件 hidetake 2001/06/29-15:30
記事番号11998へのコメント
そうか Ogo さんは Access97 で試しているのね!

手元にある資料より「メタ文字」

         SQL Server  Access   Oracle
----------------------------------------------------
任意の文字列    %     % または *   %
任意の1文字    _     _ または ?   _
範囲指定の1文字  [a-f]    [a-f]     なし
範囲指定外の1文字 [^a-f]   [!a-f]    なし

※ Access97 では % _ は使用できません。

手元の Access2000 を入れた ODBC 環境で Access2.0 のMDB に接続した範囲では、先の例でうまく動いています。
先ほど手元のテスト機に SQL Server7.0 を入れたところですので SQL Sever でもチェックできるとは思いますけど・・・

12000 Re:外部データベースの絞り込み条件 hidetake 2001/06/29-15:35
記事番号11998へのコメント
>で、言わんとすることは、桐の外部データベース操作の場合、
>* でワイルドカードの役目を果たしています( Jet でなく、
>MS-SQL サーバーにおいても)。
>ところが、 &STR* という記述の場合、 &STR がヌルの場合、
>対象項目値がヌル値である時に、選択データから漏れてしま
>うのです。

これは桐が単純式を入れた場合のみSQL に変換する段階で加工しているだけの事でしょうけど・・・

と言うことは ODBC ドライバを見て% や * を使い分けているのだろうか?
あるいは、していないからまともな結果が帰って来ないとか?

12002 Re:外部データベースの絞り込み条件 Ogo 2001/06/29-15:51
記事番号12000へのコメント

>と言うことは ODBC ドライバを見て
>% や * を使い分けているのだろうか?
>あるいは、していないからまともな
>結果が帰って来ないとか?

Access なら OK で、 SQL サーバーならダメとかではないです。 (^^;;

う〜ん、実際の運用では単独項目のみの Where でなく、2項目以上でこれと同等の計算式を入れて選択をさせた場合に、
どちらかの項目値がヌルの場合に、それを特定させるための変数がヌルであったら選択レコードからは抜け落ちてしまうと言う状況なのです。 (T_T)

もちろん、値がヌルになっている変数で先頭一致の選択をしたい項目値がヌルでないものはちゃんと入っているのだけれど。

それで &STR という記述方法ではなく、 #条件選択()をわざわざ噛まして質問したのです。

#DSQL(Switch(IsNull(&STR),True,True,([hogehoge] Like "*" & &STR ))

みたいなトコロかな? とは思っていたんだが(Access以外でこの計算式が通用するか否かも判らんが)。


12003 Re:外部データベースの絞り込み条件 hidetake 2001/06/29-15:55
記事番号12002へのコメント
>#DSQL(Switch(IsNull(&STR),True,True,([hogehoge] Like "*" & &STR ))

#DSQL は自分で書いたものをそのまま渡すのでSQL Server に対しては * を使った段階で意味の無い式になってしまうでしょう・・・


12004 Re:外部データベースの絞り込み条件 Ogo 2001/06/29-15:58
記事番号12003へのコメント

>>#DSQL(Switch(IsNull(&STR),True,True,([hogehoge] Like "*" & &STR ))

>#DSQL は自分で書いたものをそのまま渡すので
>SQL Server に対しては * を使った段階で意味
>の無い式になってしまうでしょう・・・

なるほど、そうでしょうねぇ。
という事は、この点に関しては ODBC ソースを入れ替えると稼働不能に陥ってしまうわけですねぇ……

ホントに困ったモノだ。


12005 Re:外部データベースの絞り込み条件 hidetake 2001/06/29-16:03
記事番号12003へのコメント
>#DSQL("[hogehoge] Like &STR + '%'")

私が書いたあの式は Access2000 を入れたODBC 環境で MDB に接続してもSQL Server 7.0 に対しての接続でも

&STR に何も入っていない状態では % だけの評価になるから全てのレコードが帰されるし、
&STR に '山' と入っていれば、山田さんや山本さんが帰されるし、'%井' と入っていれば、井上さんに横井さんと帰されますけど・・・


12006 Re:外部データベースの絞り込み条件 hidetake 2001/06/29-16:12
記事番号12004へのコメント
>ホントに困ったモノだ。

120日間評価バージョンでも入れる :-)

12009 Re:外部データベースの絞り込み条件 Ogo 2001/06/29-16:16
記事番号12005へのコメント

>>#DSQL("[hogehoge] Like &STR + '%'")
>
>私が書いたあの式は Access2000 を入れた
>ODBC 環境で MDB に接続しても
>SQL Server 7.0 に対しての接続でも
>
>&STR に何も入っていない状態では % だけの
>評価になるから全てのレコードが帰されるし、
>&STR に '山' と入っていれば、山田さんや
>山本さんが帰されるし、'%井' と入っていれ
>ば、井上さんに横井さんと帰されますけど・・・

と言うことは、 #DSQL を使った直接記述なら OK で、桐の変換を経由する &STR* という記述(#DSQL は使わない)ではダメという結末なのだろうか。

12013 Re:外部データベースの絞り込み条件 hidetake 2001/06/29-16:36
記事番号12009へのコメント
なお、私の Access2000 を入れたODBC 環境で MDB に接続してもSQL Server 7.0 に対しての接続でも

>#DSQL("[hogehoge] Like &STR + '%'")

は、単純式 &STR* と書いた場合とほぼ等価のようです。
完全に同等では無いようです。

なお、単純式では &STR% や &STR + "%"は許されません。

あと、&STR に "*山" と言うような "*" を含ましても、これはメタ文字としてではなく、文字そのものとして扱われるようです。
何も出てこなくなります・・・

なお、"%山" と "%" はそのまま相手に渡されたとしても相手側でメタ文字として評価されるので、内山さんも評価されます。


12015 Re:外部データベースの絞り込み条件 hidetake 2001/06/29-16:49
記事番号12013へのコメント
>は、単純式 &STR* と書いた場合
>とほぼ等価のようです。
>完全に同等では無いようです。

何か桐側にまかしてしまうと逆に面倒くさそう?

&STR* とすれば Like に展開するのだろうけど、&STR とだけ書けば完全一致で = となるのだろう!

そうすると &STR の中に * や% を含ませてしまったら、期待と違って当然一致するものは出てこない・・・


12017 Re:外部データベースの絞り込み条件 hidetake 2001/06/29-17:05
記事番号12015へのコメント
>何か桐側にまかしてしまうと
>逆に面倒くさそう?

この辺は式の評価の順序の問題も関わって来ているのでは無いのだろうか?

条件式に入っている計算を全て評価した上で、その前後に付いているメタ文字などを見て SQL 文に展開する。

あるいは、条件式に設定されているメタ文字などを取り敢えず評価し、SQL 文に展開し、その上で細かい計算式を計算する

とか・・・


戻る