11/01/27 09:33:36
どこかのプロジェクトで、SQLで四則演算してはいけない という
コーディングルールがあったんだけど、その理由を失念してしまいました。
なにか、該当するような事象ってあるんですかね?計算結果がおかしくなるとか.
830:NAME IS NULL
11/01/27 14:16:13 xnnaktpA
MySQL 5.1を使っているのですが、
リストにabc,def,ghiのように単語が登録されているとき、
"hogehogeabchogehogehogeghihogejklhogehoge"という文から、
abc,ghiという単語がこの文に含まれているというような検索をしたいのですが、書き方がわかりません。
それ以前に、データベースでこのような検索は可能ですか?
831:NAME IS NULL
11/01/27 18:10:00
>>829
桁数とか丸め誤差がアプリケーションと違っちゃうのが嫌だったとか
>>830
where COL_NAME like '%abc%' and COL_NAME like '%ghi%'
とか?
832:NAME IS NULL
11/01/28 01:13:12 sGatbyEv
>>831
リストには数百個あるので、それだと結構大変かもしれないです。
具体的には、文の中でリストにある単語のどれが出たかを出力するものを制作しています。
単語ごとに区切ってデータベースにアクセスすればできそうですが、制約上単語ごとに区切れないもので・・・。
833:NAME IS NULL
11/01/28 01:20:31
単語が複数見つかった場合はどうすんだろ。
834:NAME IS NULL
11/01/28 03:08:55
リストというテーブルの単語という項目に単語が含まれてるとして
select 単語 from リスト
where 対象の文 like '%' + 単語 + '%'
こんな感じってことじゃ?
(+で文字列連結できる前提な)
MySQLで動くかどうかしらんが
835:NAME IS NULL
11/01/28 03:51:46 uBEDX4Y3
文って単数なの、
複数なの(テーブルにひとつの項目として保存されてるの)?
836:NAME IS NULL
11/01/28 06:55:13
Prologの回答だと、
URLリンク(nojiriko.asia)
findallという述語がSELECTに似ているから、ここの住人は
解ると思う。
837:NAME IS NULL
11/01/28 07:03:57
上の回答は単語数100などは想定していない。
このままコードで単語数が10数個を越えたら、
組み合わせの処理でスタックオーバーフローに
なって失敗する。
length(_単語ならび,Len) を止めて、単語の
最大数(現在のLen)を限定して指定する必要が
あります。
838:NAME IS NULL
11/01/28 11:04:32
スレ違いかつ要件を満たしていないことを自信満々に言われてもどうしたらいいのか
839:NAME IS NULL
11/01/28 11:10:44
スルーすればいいよ。
840:NAME IS NULL
11/01/28 11:36:31
スレ違いは覚悟の上なんだが、ここで指摘したかったのは
リストからどのように検索対象を取り出すかということ。
この質問はその部分があいまい。全部の可能性を考えると
こんなアルゴリズムになりますよというのが >>836
あとから>>832を読んで、数百個あるので、というところで
マイッタw
841:NAME IS NULL
11/01/29 10:06:10 Kh+BN3Cq
>>833
単語が重複した場合が数えません。
>>835
文は特にデータベースに保存しません。
単語数のみをデータベースに保存していきます。
やっぱりデータベースで全てやるのは難しいみたいですね・・・。
Perl等で単語をデータベースから1個ずつ引っ張って、文の中に含まれるかを検索するほうが無難かもしれませんね。
ありがとうございました。
842:NAME IS NULL
11/01/29 10:21:46 wMofn+ab
>>841
それだったら>>834ちょこっと変えればいけるんじゃないの
文の結合はoracleだったら||でやればいいし
あとはGROUP BY 単語 をかませれば単語毎のカウントもできるだろ
843:NAME IS NULL
11/01/29 11:24:53 wMofn+ab
やっぱSQLじゃ無理そうだな
同じ一文だとカウントされそうもないや
全部一件になるな
844:NAME IS NULL
11/01/29 17:58:38
>>834のcountでなにが悪いのかがわからんや
845:NAME IS NULL
11/01/29 18:13:29 wMofn+ab
>>844
多分検索対象の文を一字づつ削った文
文の文字数分の行を用意しないとだめ
846:NAME IS NULL
11/02/01 21:16:33
・DBMS名とバージョン
Microsoft Access2000
・テーブルデータ
【ITEM_COUNT】
item_id | year | month | count
---------------------------
00001 | 2010 | 1 | 150
00001 | 2010 | 1 | 400
00001 | 2010 | 2 | 20
(中略)
00001 | 2010 | 11 | 120
00001 | 2010 | 11 | 50
00001 | 2010 | 11 | 200
00001 | 2010 | 12 | 30
00001 | 2011 | 1 | 500
00001 | 2011 | 1 | 100
00002 | 2010 | 1 | 10
00002 | 2010 | 2 | 30
00002 | 2010 | 2 | 100
(後略)
※同じid, year, monthのデータが複数存在します。
・欲しい結果
item_id | 1月 | 2月 | … | 11月 | 12月 | 13月
--------------------------------------------
00001 | 550 | 20 | … | 370 | 30 | 610
00002 | 10 | 130 | … | (後略)
※2010/1~2011/1の13ヶ月間を1月~13月として(2011/1を13月として)それぞれ集計を求めたい
・説明
現状は、
------------------------------------
SELECT
year, item_id
FROM
ITEM_COUNT
WHERE
year=2010
GROUP BY
item_id, year
PIVOT
Format(month,"#0月") In ("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月");
------------------------------------
上のクエリを「集計1」、WHERE句を"year=2011"に変更したものを「集計2」とし、
次のクエリで結果を求めています。
------------------------------------
SELECT
集計1.item_id, 集計1.[1月], 集計1.[2月], … , 集計1.[12月],集計2.[1月] AS 13月
FROM
集計1 LEFT JOIN 集計2 ON 集計1.[item_id] = 集計2.[item_id]
------------------------------------
しかしこれだと2011/1にのみデータがあるitem_idが集計から外れてしまいます。
これを回避するにはどのように直したら良いでしょうか。
847:NAME IS NULL
11/02/01 21:36:38
2010/01から2011/01までに存在するitem_idの一覧を求めるクエリに
集計1と集計2をleft outer joinすりゃいいんじゃね?
848:846
11/02/01 22:24:47
>>847
レスありがとうございます。
なんとなくイメージが掴めたのでやってみます。
849:NAME IS NULL
11/02/02 13:52:31
k - Nearest Neighborがsqlで出来ると聞いたのですが
どんな書き方するのでしょうか