HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0212
masako99sqlele のsubstrb について8解決


masako99

リンク

2018/2/12(Mon) 13:04:44|NO.82446

sqleleでsubstrbが使えないのは仕様でしょうか?
substrが使えるだけでも便利ですが、substrbを使ってデータを抽出したかったので残念です。

バイト分文字列を取得する方法は他にあるでしょうか?


#include "sqlele.hsp" sql_open ":memory:" sdim buf buf(0)="私はsqleleを使って〜半角・全角スペース混在〜 3日です" buf(1)="私はsqlを使って〜半角・全角スペース混在〜10日です" sql_q "CREATE TABLE IF NOT EXISTS tbl (ID INTEGER PRIMARY KEY, clm);" repeat 2 sql_q "INSERT INTO tbl (clm) VALUES ("+prm_text(buf(cnt))+");" loop sql_q "SELECT clm, SUBSTR(clm, 3, 6) AS 半全角 FROM tbl;" repeat stat mes ""+cnt+" : "+sql_v("半全角") sql_next loop sql_close stop 結果は 0 : sqlele ;6文字 1 : sqlを使っ ;6文字 --------------------------------------------- sql_q "SELECT clm, SUBSTRB(clm, start, length) AS 半全角 FROM tbl;" 0 : 3日 1 : 10日 という結果が得たいのですがエラーになってしまいます。



この記事に返信する


kanahiron

リンク

2018/2/12(Mon) 15:45:16|NO.82448

substrbはOracleDBのみ存在する関数で、SQLeleの使用しているDB、SQLiteには存在しません
ざっと検索しても代替方法は見つけられませんでした…すみません
条件は限られますが、HSPのstrmidがバイト数でしか考えませんので、全文出力してHSP側で操作くらいでしょうか…



ぜーっと!

リンク

2018/2/12(Mon) 16:35:42|NO.82449

提示されたスクリプトを実行したら、きちんと結果でているようなので
一応説明すると、SUBSTR は、HSPでいうところの strmid と考え方は同じのようです。
検索ではなく、指定文字数目から指定文字数取得になります。

> sql_q "SELECT clm, SUBSTR(clm, 3, 6) AS 半全角 FROM tbl;"

masako99さんの組んだプログラムの結果は、
SUBSTR(clm, 3, 6)は文字列の3文字目から6文字分取得なので、

> 0 : sqlele ;6文字
> 1 : sqlを使っ ;6文字

組まれたプログラムの通りの答えのようです。

文字列の取得したい部分が「半角2文字+"日です"」の組み合わせ固定なら、
同じ SUBSTR を使って、後ろから指定して文字列を取得すれば良いのでは。

sql_q "SELECT clm, SUBSTR(clm, -5, 3) AS 半全角 FROM tbl;" //後ろから5文字目、3文字取得

とりあえず、これで取り出したい

> 0 : 3日
> 1 : 10日

になりませんか?

文字の検索は、INSTRとかあるようです。
あ、ついでに、前回の質問にも、解決された後になってしまいましたが、
回答しているので、見てください。



ぜーっと!

リンク

2018/2/12(Mon) 17:09:04|NO.82452

kanahironさん
どもども。
masako99さんの実際のdbの環境がわからないので、
あまり細かいところは考えていません。ヒントにでもなればと。

ちなみに、SUBSTRBではなく、SUBSTRでやっています。

sql_q "SELECT clm, SUBSTR(clm, -5, 3) AS 半全角 FROM tbl;"

での結果は、

0 : 3日 1 : 10日

ここのBBSが勝手にスペースを詰めていたようで、見た目が違っていたようですが
必要としている答えになっていたので一応書いてみました。
もちろん、文字列が固定になっていないのであれば、使えませんけどね・・。



masako99

リンク

2018/2/12(Mon) 18:05:12|NO.82454

kanahironさん、質問後よく見たらOracleDBでのみ使えることを知ったので
お手間を取らせてしまったようで申し訳ございませんでした。

ぜーっと!さん、サンプルありがとうございました。
自己解決した後は、あちこちのSQLサンプルを見て
プログラム出来ていたので見ていませんでした。
お返事できずすみませんでした。

サンプルの書き方が良くなかったようで
後ろから指定して文字列を取得するのは無理です。

buf(0)="00120180101元旦++++++++++++0108成人式++++++++++〜半角英数・全角文字混在〜・・・・"
buf(1)="00220180211建国記念の日++++0212振替休日++++++++〜半角・全角スペース混在〜・・・・"
+=半角スペース
1行のバイト数がおよそ1000バイト、取得したい文字列がかなり有るのでカラムに振り分けてもいいのですが
多過ぎる気がして手を付けていません。
固定長なので以前はstrmidで変数に振り分けていましたが折角SQLが使えるのでsubstrbが使えれば、と思って質問しました。
あっれ〜もしかして・・・固定長なんだから・・・
「元旦」を取るには、
sql_q "SELECT clm, SUBSTR(clm, 12, 16) AS 半全角 FROM tbl;"
成人式を取るには、
sql_q "SELECT clm, SUBSTR(clm, 33, 16) AS 半全角 FROM tbl;"
でいいみたいです・・・よね?
何か勘違いの質問だったでしょうかorz



ぜーっと!

リンク

2018/2/12(Mon) 20:45:14|NO.82455

あらら、データは固定長でも、データの並びはバラバラなのですね。残念。

各行のデータの先頭は、半角5桁+日付半角6桁だから文字取得できますが、
それ以降の半角スペースの数が違うため、SUBSTRを決め打ち取得は通用しないようですね。

最終的なアウトプットがどのような形で使用されるものなのか分からないので何ともですが、
データからさらに大量に分割する必要があるなら、SQLでdbからデータを
1行分受け取ってHSP側で処理した方が早いような気もしますが、どうでしょう・・。



masako99

リンク

2018/2/12(Mon) 22:28:29|NO.82458

buf(0)="00120180101元旦++++++++++++0108成人式++++++++++〜半角英数・全角文字混在〜・・・・"
buf(1)="00220180211建国記念の日++++0212振替休日++++++++〜半角・全角スペース混在〜・・・・"
+=半角スペース

今度はsql文が違ったみたいで、
取得するbyte数は16ですが余り分は半角スペースなので
「元旦」,「建国記念の日」を取るには、
sql_q "SELECT clm, SUBSTR(clm, 12, 8) AS 半全角 FROM tbl;"
「成人式」,「振替休日」を取るには、
sql_q "SELECT clm, SUBSTR(clm, 33, 8) AS 半全角 FROM tbl;"
スタート位置のアドレスが決まっているので、
SUBSTRの決め打ち取得は通用しそうです。
最初から全角部分は2/byte数にしていればこんな間違いは起こらなかったのだと思います。

SUBSTR(clm, 12, 16)でプログラムしたせいでお答えいただいた方々に
貴重なお時間を使わせてしまって本当に申し訳ございませんでした。
ただ、プログラムは好きなのですがセンスがないのでちょっとしたミスですぐに躓いてしまいます。
親切にお答えいただいて疑問が解ければこれからのプログラミングにも励みが出ます。
またよろしくお願い致します。



ぜーっと!

リンク

2018/2/13(Tue) 20:39:03|NO.82459

なるほど、決め打ちでも大丈夫ならばそれでOKですね。

現状、HSPで処理しようと思えば、まずすべてのスペース文字をCRLF(\n)に置き換えてしまい、
あとはノートパッドで行毎に処理すれば、うまくいくと思います。

もともと先に用意されているデータに対しての処理であれば仕方ないと思いますが、
もし自身でデータも用意しているのであれば、データベース言語処理の恩恵を受けるためにも
1つのカラムにすべてのデータを押し込めるより、項目別にデータを
分けて入れ込むようにすれば、検索や取り出すときも、かなり楽になると思います。

たとえば

+-------+----------+--------------+ | INT型 | DATE型 |  文字列  | +-------+----------+--------------+ | 1 | 20180101 | 元旦 | | 2 | 20180108 | 成人式 | 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 | 10 | 20180211 | 建国記念日 | | 11 | 20180212 | 振替休日 |

のようにすれば、クエリ次第で日付個別取得や
月単位で検索して複数取得もできるので便利かと思います。



masako99

リンク

2018/2/16(Fri) 10:13:15|NO.82470

ぜーっと!さん
やっぱり決め打ちは出来ませんでした(^^ゞ
元データからstrmidで、と思いましたが改行は気が付きませんでした。
頑張ってみます。ありがとうございました。



ONION software Copyright 1997-2018(c) All rights reserved.