5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

SQL質疑応答スレ 12問目

1 :NAME IS NULL:2011/09/23(金) 18:22:58.35 ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。

質問するときはDBMS名を必ず付記してください。

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明

前スレ:
SQL質疑応答スレ 11問目
http://hibari.2ch.net/test/read.cgi/db/1299305530/

883 :Kinjyo Hirohito:2012/07/08(日) 23:56:14.25 ID:???
Stored Procedureを用いてループさせるとした場合ならどうでしょうか
特にどのSQLかは、こだわりませんが、擬似SQLコードでは、どうでしょうか?

     JUL  JUL7 JUL9 JUL
     OPEN   IN OUT IN OUT IN OUT CLOSE
アイテム 15 3 5 3 3 8 10


884 :NAME IS NULL:2012/07/09(月) 00:22:30.19 ID:???
>>881
まともに意見が欲しいなら、もうちょっと他人に解るように説明した方が良いんじゃね
俺様用語が多すぎるわ

SQLに「表記」はないぞ
なぜそれをカラム可変でやる必要があるのか理解できん
素直に日付ごとに行を持てば(出力すれば)良いんじゃないのか


885 :Kinjyo Hirohito:2012/07/09(月) 23:45:13.84 ID:???
トランザクションが毎日あるなら別ですが、1週間に2,3回とかですと、
ブランクばかりになってしまいます、ですので可変で表記する必要があります
もちろんレコードが存在する日付のみを、カスケイドすれば可変になりますが
それでは、知恵がないかと思いまして、SQLに経験豊かな方々は、
どのようなコーディングをされるのかを、拝見したく思いまして

886 :NAME IS NULL:2012/07/10(火) 00:04:30.95 ID:???
>>885
>>884は、カラム数を可変にする必要性があるのかっていってるんだが?
トランザクションが二日あったら、2行で出力すれば良いんじゃないのか?
それを表示するときにホストアプリで縦横変換すれば良いだけで
データの表示形式を決めるのはSQLの範疇ではないって言ってるんだが

>レコードが存在する日付のみを、カスケイドすれば可変
意味がわからん


887 :NAME IS NULL:2012/07/10(火) 00:11:39.66 ID:???
日本語でおk

888 :NAME IS NULL:2012/07/10(火) 05:47:11.21 ID:???
そもそも、これは7月の入出庫だけが入っているテーブルなのかな。
7月だけActiveにしてあるなんて考え難いし。

889 :Kinjyo Hirohito:2012/07/10(火) 07:23:45.50 ID:???
Activeは、その月を取り出すためためだけの目的でして、
倉庫では、お客様の都合で2重帳簿を作ることがしばしばあります
つまりトランザクションDATEの年と月だけでデータ抽出すると
要望に答えれないからです。在庫があるのに、落としてある、
在庫がないのに、あるように見せるなど、各お客の要望に従って
幾つかのACTIVEのようなカラムを儲けています

890 :NAME IS NULL:2012/07/10(火) 09:10:09.76 ID:???
後から後からどんどん条件が出てくる w

891 :NAME IS NULL:2012/07/10(火) 10:09:57.34 ID:???
条件というか蛇足だな
本質は>>5のカラム数をデータに依存して決定したいという話なのに

892 :NAME IS NULL:2012/07/10(火) 10:29:42.27 ID:???
自分で調べる奴・・・問題の本質を理解する力がある
2chで聞いて済ませる奴・・・抽象化する力がないので質問内容もわけわかめ

893 :NAME IS NULL:2012/07/10(火) 22:07:06.14 ID:???
SQLじゃなくてRPGでも使うべきなんだろうな、ああいう人は。

894 :NAME IS NULL:2012/07/10(火) 22:29:11.76 ID:???
SQLの代わりにグレネードランチャー使うって凄いな

895 :NAME IS NULL:2012/07/10(火) 22:50:11.91 ID:???
oracle使っているのですが、
カンマ区切りの文字列を、カンマで分割した複数行としてSELECTできないでしょうか?

SELECT * FROM (select "1,2,3,4" from dual) 〜〜〜〜〜
とかで複数行として、カンマ分割した結果がほしいです!

896 :NAME IS NULL:2012/07/10(火) 22:57:58.51 ID:???
無理やりやるならテキストデータレベルでカンマを「 from dual union select 」で置換して
select * from (select '1' from dual union select '2' from dual union select '3' from dual union 〜)
みたいにする

897 :NAME IS NULL:2012/07/10(火) 22:58:18.39 ID:???
>>895
ストアド書けばいいんじゃね?
http://ichi-note.sblo.jp/article/34919609.html

898 :895:2012/07/10(火) 23:33:45.63 ID:???
ご教示ありがとうございます!
テキストベースにしたりファンクションにしたりしないとやはり厳しいんですね・・・。
ファンクション形式でやってみます!

899 :NAME IS NULL:2012/07/11(水) 04:31:57.39 ID:???
まず格納時にちゃんと複数行で格納するべき
それが無理なら、ホストアプリで分解する
SQLやストアドで何とかするのはとても勧められない

900 :NAME IS NULL:2012/07/11(水) 10:40:32.47 ID:???
テーブル名:PRODUCT

CODE, PRODUCT_NAME, M_Type
001,パソコン,01
002,パソコン NEC,01
003,パソコン FUJITSU,01
004,パソコン,01
005,パソコン,02
006,プリンター,03
・・・

とあるとき

@
PRODUCT_NAMEの重複するデータを抽出するにはどうしたらいいでしょうか?

001,パソコン,01
004,パソコン,01
005,パソコン,02

が出て欲しい

A
PRODUCT_NAMEかつM_Typeも一緒のデータを抽出するにはどうしたらいいでしょうか?

001,パソコン,01
004,パソコン,01

が出て欲しい

お願いします。



901 :NAME IS NULL:2012/07/11(水) 11:04:57.54 ID:???
GROUP BYしてHAVINGかな

902 :NAME IS NULL:2012/07/11(水) 11:35:56.43 ID:???
DBMS:SQLite3.7.12.1(System.Data.SQLite1.0.81.0)

[テーブルデータ]

CREATE TABLE tblA(
id INTEGER,
status001 INTEGER,
status002 INTEGER,
status003 INTEGER,
status004 INTEGER,
.
.
.
status300 INTEGER
);

id |status001|status002|.... . |status300|
----+--------+--------+ +--------|
1| 0 | 0 | | 0 |
2| 1 | 0 | | 0 |
3| 0 | 0 | | 1 |
4| 0 | 1 | | 1 |
5| 0 | 0 | | 0 |
6| 1 | 1 | | 0 |
7| 0 | 1 | | 0 |
8| 1 | 1 | | 1 |
9| 1 | 1 | | 0 |

想定レコード数 50,000〜2000,000

[欲しい結果]
-------------------------------------------
status001 | 4 //status001=1であるレコード数
status002 | 5 //status002=1であるレコード数
.
.
.
status300 | 3 //status300=1であるレコード数

正規化に問題があるように思えますが
これらを一度のSQLで取得出来ないでしょうか。
この結果を最も速く取得する方法を模索しています(__)


903 :NAME IS NULL:2012/07/11(水) 12:53:07.45 ID:???
UNIONを300書けばできる

904 :902:2012/07/11(水) 13:27:22.01 ID:???
>>903
一例ありがとうございます。既にそちらの方法は作成済みです。

905 :NAME IS NULL:2012/07/11(水) 16:03:08.87 ID:???
>>901

すみません知識不足のためよくわからないです。
サブクエリの部分がよくわからないです。

906 :NAME IS NULL:2012/07/11(水) 16:48:12.77 ID:???
ggrks

907 :NAME IS NULL:2012/07/11(水) 17:44:27.04 ID:???
>>900
select * from product group by product_name having count(*) > 1;
かな。試してないけど。

908 :NAME IS NULL:2012/07/11(水) 18:10:02.97 ID:???
>>900
@
select *
from  PRODUCT T1
where  exists (
        select *
        from  PRODUCT T2
        where  T1.CODE <> T2.CODE
        and   T1.PRODUCT_NAME = T2.PRODUCT_NAME
    )
;

A
select *
from  PRODUCT T1
where  exists (
        select *
        from  PRODUCT T2
        where  T1.CODE <> T2.CODE
        and   T1.PRODUCT_NAME = T2.PRODUCT_NAME
        and   T1.M_Type = T2.M_Type
    )
;

909 :NAME IS NULL:2012/07/11(水) 18:22:06.44 ID:???
>>902
>>903に一票

それか結果を
status001|status002|.... .|status300|
--------+--------+  +--------|
      4|     5|  |      3|
で得てからアプリ側で縦横入れ替えるか

910 :NAME IS NULL:2012/07/12(木) 11:02:21.60 ID:???
テーブル作りなおすべき

911 :NAME IS NULL:2012/07/12(木) 11:31:15.26 ID:???
【質問テンプレ】
・SQLite3
・テーブル
id,unixtime
100001,1341404056
100001,1341997094
100001,1341987930
100002,1341997860
100002,1341989037

・欲しい結果
100001,1341997094
100002,1341997860

・説明
上記テーブルでid毎にunixtimeが一番大きいデータを1つだけ取り出すには
どのようなクエリでできるでしょうか。1回では無理でしょうか。

912 :NAME IS NULL:2012/07/12(木) 11:40:58.03 ID:???
select id,max(unixtime) from hoge group by id order by id;

913 :911:2012/07/12(木) 11:53:58.76 ID:???
すみません、情報不足でした。テーブルにはテキスト情報もあり、
id,unixtime,value
"1" "1341404056" "内容1"
"1" "1341997094" "内容2"
"1" "1341987930" "内容3"
"2" "1341997860" "内容1"
"2" "1341989037" "内容2"

このような場合に
>>912さんに教えていただいた
select id,max(unixtime),value from t_test group by id order by id
とすると、
"1" "1341997094" "内容3"
"2" "1341997860" "内容2"
と内容がずれてしまうのですが、

こういった場合では、
"1" "1341997094" "内容2"
"2" "1341997860" "内容1"
と出すにはどうしたらよいでしょうか。

914 :NAME IS NULL:2012/07/12(木) 12:07:38.20 ID:???
>>913
それだと副問い合わせになるな
(id,unixtime) がユニークだとして

select t.id,t.unixtime,t.value from t_test t,
(select id,max(unixtime) as unixtime from t_test group by id) tmp
where t.id=tmp.id and t.unixtime=tmp.unixtime
order by t.id;

915 :911:2012/07/12(木) 12:25:38.43 ID:???
>>914
神様ありがとうございます!出来ました!

916 :902:2012/07/12(木) 13:38:28.50 ID:???
ご意見ありがとうございます!

>>909
検討してみます。

>>910
status群を子テーブルにするのが正しい姿のような気がします。


917 :NAME IS NULL:2012/07/12(木) 13:52:41.61 ID:???
代わりにエクセルとかでささっと編集するのが面倒になるけどね

918 :NAME IS NULL:2012/07/17(火) 22:22:45.76 ID:Di4GcY9V
・DBMS名とバージョン
MySQL5
・テーブルデータ
name (verchar)

abc040
abc100
abc90
abc20
abc1000

・欲しい結果
nameはユニーク
abcは固定、そのあとに数値文字列
ソートして、数値文字列の大きい順に抽出したい

abc1000
abc100
abc90
abc040
abc20

・説明


919 :NAME IS NULL:2012/07/17(火) 22:46:27.80 ID:???
4文字目以降をゼロ詰めしてソートすればいいな。

920 :NAME IS NULL:2012/07/17(火) 23:08:36.14 ID:???
4文字目以降の文字列を作る
左側を0でトリムする
その値で降順ソートする

921 :NAME IS NULL:2012/07/17(火) 23:16:02.84 ID:???
ご意見ありがとうございます!

ちょっと難しそうですね。

922 :NAME IS NULL:2012/07/18(水) 01:16:57.24 ID:???
ABCが固定であれば、
order by カラムdesc;
じゃ駄目なの?

923 :NAME IS NULL:2012/07/18(水) 03:57:57.20 ID:???
4ケタ目以降で、ゼロ埋めじゃなくて、数字変換する方が良いと思うんだが
つかまあテーブル定義やり直すべきだろう
カラムは最小単位で定義するのが鉄則

924 :NAME IS NULL:2012/07/18(水) 08:04:37.87 ID:???
>>922
それだと
abc90
abc20
abc1000
abc100
abc040
こうなるよ

925 :NAME IS NULL:2012/07/18(水) 16:16:22.74 ID:???
>>918
SELECT * FROM table ORDER BY CAST(TRIM(LEADING 'abc' FROM name) AS SIGNED INTEGER);


926 :NAME IS NULL:2012/07/18(水) 21:22:10.82 ID:???
>>925
完璧です。
ありがとうございます。

927 :NAME IS NULL:2012/07/19(木) 00:26:03.79 ID:???
・バージョン
MySQL5.5

・テーブルデータ
time (TIME), num1 (INT), num2 (INT)

00:00:00, 1, 0
00:00:10, 2, 0
00:00:20, 3, 2
00:00:30, 4, 3
00:00:40, 5, 3

・欲しい結果
00:00:20, 3, 2
00:00:30, 4, 3
00:00:40, 5, 3

・説明
time(時刻)が新しい(最近の)方から3行ぬきだし、
timeが昇順になるように並べます。
SELECT文でうまいことできないでしょうか。
よろしくお願いします。

928 :NAME IS NULL:2012/07/19(木) 06:57:42.24 ID:???
>>927

↓俺が使ってるもの(銘柄コード指定で最新データ10日分のを抜き出し
 日付の昇順で表示するもの

select * from
( select vdate,sp,hp,lp,cp ,vol
from daily_sp_tbl where sc=5401 order by vdate desc limit 10 ) t
order by vdate;

そちらの名称に合わせて書き換えてみたら

929 :NAME IS NULL:2012/07/19(木) 15:53:43.08 ID:???
ゴキ光線のお小言が始まるでぇ〜( ´Д`)y━・~~


930 :NAME IS NULL:2012/07/22(日) 23:57:04.02 ID:???
・DBMS名とバージョン
SQLite3
・テーブルデータ
tbl1 tid(auto), name(text)
tbl2 tid(int), sid(int)
tbl3 sid(auto), tag(text),type(int)

ざっとこんな感じでnameに対して複数のタグを持っている
といった感じのテーブルに対して、データを入れたいと思っています。
で、バックアップがCSVで「name,tag...」という形式で大量にあるのですが、
タグテーブルに無ければ追加、名前テーブルに追記、連結データを追加、
と手数が思ってた以上に多いので、
挿入の手数をもう少し減らせる手段とかありませんか?

931 :NAME IS NULL:2012/07/23(月) 06:43:06.22 ID:???
何言ってんのか分かんない

932 :SQL初心者:2012/07/23(月) 11:43:26.77 ID:???
SQLの質問がありまして、書きます。

Aテーブル
A B C
1 11
2 22
3 33


Bテーブル
A B C
4 44 1
5 55 2
6 66

欲しい結果
A B
1 44
2 55
3 33
6 66

BテーブルのCがAテーブルのAと一致したらBテーブル参照したいですが、A項目のみ値をAテーブルの値にしたいです。
何かアドバイスお願いします。。。。。
調べても、よくわからなかったので。。。
お願いします。。。


933 :NAME IS NULL:2012/07/23(月) 12:57:29.52 ID:???
>>932
欲しい結果の(3,33)と(6,66)を考えなければ
select A.A, B.B from A,B where A.A=B.C;
で簡単なんだが、下の二行はどういう条件で抽出されるべきなの?


934 :SQL初心者:2012/07/23(月) 13:03:33.77 ID:???
>>933
そうなんですね。。。
BテーブルのCに一致しないものを表示させたいです。。。。。。。

935 :NAME IS NULL:2012/07/23(月) 13:39:50.34 ID:???
AテーブルのAとBテーブルのBはかぶらないのか?
AとBをUNIONして、BをOUTER JOINしてCASEでNULL判定かな

936 :NAME IS NULL:2012/07/23(月) 18:36:14.05 ID:???
こういうことじゃないの?
select case when A.A is null B.A else A.A end as A,
    case when B.B is null A.B else B.B end as B,
from  A
    full outer join
    B
    on A.A = B.C

937 :SQL初心者:2012/07/23(月) 20:45:54.91 ID:???
大変ありがとうございました。
みなさんのおかげで、無事にできました。


938 :NAME IS NULL:2012/07/24(火) 00:21:52.45 ID:???
>>936
> case when A.A is null B.A else A.A end as A,

なんで、coalesce(A.A, B.A) 使わないの?

939 :NAME IS NULL:2012/07/24(火) 06:22:52.28 ID:Gfkf5V7p
初心者用が見つからなかったのでこちらで質問します

テーブル tbl
|-----INDEX----|--DATA--|
yyyy mm dd no item
2012 01 05 005 itemAA
2012 01 05 007 itemAC
2012 01 05 009 itemBB
2012 01 10 001 itemBA
2012 01 10 007 itemFG
2012 01 12 006 itemQW
      :
      :

結果
2012 01 10 001 itemBA
2012 01 10 007 itemFG

この場合
select * from tbl
where yyyy='2012'
 and mm='01'
 and dd='10'

このようにnoを指定しないと検索時にインデックスは有効とならないのでしょうか?
インデックスはその項目全てをSQLに明記しないと有効とはならないのでしょうか?

初歩的すぎる質問だと思いますがお願いします

940 :NAME IS NULL:2012/07/24(火) 06:24:12.46 ID:???
sage忘れました
申し訳ないです

941 :NAME IS NULL:2012/07/24(火) 06:52:25.93 ID:???
インデックスってこのスレで取り扱ってたっけ

942 :NAME IS NULL:2012/07/24(火) 06:53:23.18 ID:???
オプティマイザ次第。

943 :NAME IS NULL:2012/07/24(火) 18:40:45.30 ID:???
>>938
DBMS名書いてないから

>>939
普通のインデックス構造をもつ普通のDBMSなら普通は有効となる
ただしどんな状況でも必ずそうだとは言い切れないので
実機でアクセスパスを確かめること
(確かめる方法はDBMS固有なのでスレ違い)

944 :NAME IS NULL:2012/07/24(火) 18:58:10.33 ID:???
オプティマイザ以前に、そのDBMSでその手の検索にインデックスが有効かどうかが問題
今時のDBMSなら効くと思うけど、まずはDBMSのマニュアルで確認するべきだな
そのうえで実際の読み込みにインデックスが使われるかどうかはオプティマイザ次第

つか初心者ならまずちゃんとマニュアル読めよと

945 :NAME IS NULL:2012/07/24(火) 21:17:09.74 ID:???
・DBMS名とバージョン MySQL 5.1
・テーブルデータ
CSVファイル
"犬","シベリアンハスキー"
"猫","マンチカン"
"熊猫","レッサーパンダ"
・欲しい結果
インポートして、次のようにしたい、要するに連番をつけたい
ID 動物 種類
1 犬 シベリアンハスキー
2 猫 マンチカン
3 熊猫 レッサーパンダ
・説明
インポートするときにdefaultをつければいいのですが、SQL文で書けないでしょうか。

946 :NAME IS NULL:2012/07/24(火) 21:24:05.88 ID:???
MySQLならAUTO_INCREMENTあるだろ

947 :NAME IS NULL:2012/07/24(火) 21:26:27.73 ID:???
すると次はレコード消した時にIDが虫食い状態になるのでなんとかしたい…とかの質問が来るんだな w

948 :NAME IS NULL:2012/07/24(火) 21:38:32.92 ID:???
>>946
そうなんですが、csvのデータをいじらずにSQLのload data infile文で
なんとかならないかと思ったのですが

949 :NAME IS NULL:2012/07/24(火) 22:20:57.99 ID:???
誰がいじれなんつった?両方使えよ

950 :NAME IS NULL:2012/07/24(火) 22:23:29.63 ID:???
そんなんSQL92の範囲にあったっけ?

951 :939:2012/07/24(火) 22:28:35.43 ID:???
>>941-944
MySQL 5.5 と ACCESS2003です

オプティマイザ及びアクセスパスについて調べてみることにします
レスありがとうです (_ _)

952 :NAME IS NULL:2012/07/24(火) 23:46:11.86 ID:???
>>943
> DBMS名書いてないから

そんなこと言うなら、case もダメだろ。
Access かも知れないんだし。

前提書いてないなら、SQL-92 あたりを想定してもいいと思うんだが。

953 :NAME IS NULL:2012/07/26(木) 11:15:02.64 ID:???
MySQL5.1

セール価格表(P)
商品CD 適用日 単価
aaa 2012-08-01 2500
aaa 2012-08-20 3000
bbb 2012-08-01 10000
bbb 2012-08-15 8500

予約表(Y)
商品CD 購入日 数量
aaa 2012-08-01 2
aaa 2012-08-05 3
aaa 2012-08-25 1
bbb 2012-08-13 4
bbb 2012-08-19 5

ほしい表
aaa 2012-08-01 2 2500
aaa 2012-08-05 3 2500
aaa 2012-08-25 1 3000
bbb 2012-08-13 4 10000
bbb 2012-08-19 5 8500

購入日時点で適用日以降の単価が反映された表を得るにはどうしたらいいでしょうか

954 :NAME IS NULL:2012/07/26(木) 13:15:07.54 ID:???
>>953

SELECT
商品CD,
購入日,
数量,
(SELECT 価格 FROM セール価格表 WHERE セール価格表.商品CD = 予約表.商品CD AND セール価格表.適用日 < 予約表.購入日 ORDER BY 適用日 ASC LIMIT 1) AS 価格,
FROM
予約表

みたいのでいけない?
思いつきで確認してない上に普段こうならんように組んじゃうから間違っているかもだけど。
あと、もっと効率のいいのがると思うけど。

955 :NAME IS NULL:2012/07/26(木) 13:22:03.93 ID:???
予約表に単価を持たせる
冗長だけど我慢する

956 :NAME IS NULL:2012/07/26(木) 13:50:59.48 ID:???
>>954

下記のように少し直しましたら、動きました・・☆。
ありがとうございました。

SELECT
商品CD,
購入日,
数量,
(SELECT 価格 FROM セール価格表 WHERE セール価格表.商品CD = 予約表.商品CD AND セール価格表.適用日 <= 予約表.購入日 ORDER BY 適用日 DESC LIMIT 1) AS 価格,
FROM
予約表

957 :NAME IS NULL:2012/07/26(木) 13:56:30.95 ID:???
>>955
セール価格表には単価だけでなく、期間立てで持っているフィールドがあるんです。

958 :NAME IS NULL:2012/07/26(木) 13:58:30.67 ID:???
>>956
決して効率よくないはず。
可能であれば、ホスト言語側でマージして
DB側に負担かけないようにしたほうが後日幸せになれるはず。


959 :NAME IS NULL:2012/07/26(木) 14:37:47.34 ID:???
MySQL 5.1です。

テーブル1
15:30:20 カツ丼
15:35:40 天丼
15:50:15 他人丼

テーブル2
15:30:30 400円
15:35:45 550円
15:51:00 480円

というテーブルがあって、テーブル1と2の時刻が近いものをマッチさせて
15:30:20 カツ丼 400円
15:35:40 天丼 550円
15:50:15 他人丼 480円

のような結果を出したいのですが、どのようにすればいいでしょうか。

よろしくお願いします。

960 :NAME IS NULL:2012/07/26(木) 15:52:58.39 ID:???
夏休みだからかな。
なんかの設問ぽいのが来ているな。

>>959
UNIX_TIMESTAMP()とABS()使って最も差分が最小値のを取り出せばいいんじゃないかな。
これ以上は、>>4見て質問書き直して。

UNIXTIME_TIME

961 :NAME IS NULL:2012/07/26(木) 16:12:19.74 ID:???
>>959
ごめん。
TIME_TO_SEC()だわ。

962 :NAME IS NULL:2012/07/26(木) 17:54:19.18 ID:???
>>960-961
設問じゃないのですが、ありがとうございます。

963 :NAME IS NULL:2012/07/27(金) 10:17:32.88 ID:KIhgtPiw
・DBMS名とバージョン
SQLite3

・テーブルデータ
テーブル名 directory
folder   val
/contact/  index
/test/    connect
/example/  foo
/hoge/    bar
/fuga/    com

・欲しい結果
問い合わせ内容とfolderの内容が部分一致していればvalを返す
/contact/ にアクセスがあった場合はindexを返す
/contact/foo の場合もindexを返す

・説明
$folder_hensuu = "%/contact/%";
select * from directory WHERE folder LIKE $folder_hensuu
とした場合はヒットするが

$folder_hensuu = "%/contact/hogehoge%";
の場合はヒットしない。
この場合はどうすれば一致判定が出来るようになりますか?

964 :NAME IS NULL:2012/07/27(金) 12:03:20.04 ID:???
SQLite3はよくわからないんだけど、なんか逆にすべきな気がする。
つまり、部分一致する際にそのWHEREの基準となるのがfolderカラムのほうでしょ。
だから、カラムのほうに文字列結合でみたいにすればいいんではないでしょか。
MySQLしか出来ないのでこれ以上は申し訳ない…。

MySQLで書くとこんな感じ。
SELECT val FROM test WHERE '/connect/hogehoge' LIKE CONCAT('%',folder,'%');

965 :NAME IS NULL:2012/07/27(金) 15:51:18.54 ID:???
休憩時間が設定されているときに、指定日時より'HH:MM'後の時刻を求めたいです。

・データベース:PostgreSQL 8.4
・テーブル:
休憩時間
開始時刻 終了時刻
08:00 08:30
19:00 19:30
22:00 22:30

使うかどうかわかりませんが、次のマスタもあります。
カレンダー
日付
...
2012-07-26
2012-07-27
2012-07-28
...

・説明
指定した日時から休憩時間を除いた'HH:MM'後を計算します。
計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。

・欲しい結果
'2012-07-27 09:00'の'09:00'後 => '2012-07-27 18:00'(休憩時間がないのでそのまま足す)
'2012-07-27 09:00'の'10:00'後 => '2012-07-27 19:30'(10時間後は19:00の休憩と重なるので、19:30が答え)
'2012-07-27 09:00'の'11:00'後 => '2012-07-27 20:30'
'2012-07-27 09:00'の'13:00'後 => '2012-07-27 23:00'(19:00〜と22:00〜の二回の休憩を挟む)

966 :NAME IS NULL:2012/07/27(金) 16:12:55.58 ID:???
>>965
難問。

967 :NAME IS NULL:2012/07/27(金) 16:20:08.40 ID:???
>>965
確かに難問だ。
何を聞かれているのか説明を見るとすさまじく混乱する。

つまり、
1.出勤時刻と実労時間数を入力されたら
2.休憩時間を実労時間からはずした上で
3.勤務終了予定時刻を出力しろ。
4.ただし、終了予定時刻が休憩時間内である場合は、休憩終了時刻を出力する
ってこと?

それだけだと、欲しい結果のその日付の存在理由がなんなのかわからなくなるけど。

入力されるデータの例を出して。
ただし、ちゃんとフォーマットした形でね。

968 :967:2012/07/27(金) 16:31:53.50 ID:???
ごめん、1〜4を踏まえた上で例を考え直してってことでお願いします。
おそらく最後の例のままでいいんだろうけど
ちょと日本語読み直してたら混乱してきてた。

969 :NAME IS NULL:2012/07/27(金) 17:56:09.34 ID:???
>>967
私は出題者ではないのですが、
次の休憩開始時刻 - 一つ前の休憩終了時刻 = 就業時間 とすると
後・時間からこの就業時間を切り取って行く問題ですね。
さらに最後の休憩時間の後の就業時間をどう表現するかなど、
考えどころの多い問題のようです。

970 :965:2012/07/27(金) 18:19:05.67 ID:???
すみません。ちょっと欲張りすぎました。問題を一段階簡略化します。

休憩時間がマスタに設定されているとき、「与えられた日時」から実働9時間後の日時を求める。
(※)実働とは、休憩時間を除いた勤務時間。

この結果は、残業届けを出すときの残業開始日時を計算するときに使います。
(その後、月締め処理で残業届けに基づいて残業時間合計を計算します。)

「与えられた日時」は、未来の日付の残業届けを出すときは定時開始時刻(例えば09:00)になり、
過去の日付の残業届を出すときは、遅刻をしていればその日時になります。

例えば、'2012-07-27 09:00'と'09:00'という即値を使ったクエリで、 '2012-07-27 18:00'が計算
できるでしょうかというのが質問です。

勤務している時間を'+'、休憩時間を'_'で表すと、一日は、
++++++___++++++__+++_++_++++
みたいに表せて、任意の開始日時(下の*)から9時間後を求めたいということです。
+*++++___++++++__+++_++_++++
+++*++___++++++__+++_++_++++

うまく説明できたでしょうか?

971 :965:2012/07/27(金) 18:28:24.50 ID:???
>>969
そう、その通りです。

Excelでイメージするなら、休憩時間と勤務時間の累計をして、目視で判断すればすぐに
わかりそうな問題なんですが、クエリでできないものかと…。

最も好ましいのは、一つのクエリで結果を計算できること、
次に好ましいのは、ワークテーブルを使わずにPostgreSQLのFunctionで計算できること。

最悪はワークテーブルに「実休憩時間」を展開して、複数ステップを踏んで計算するか、
Functionを再帰呼び出しして(できるのだろうか)結果を求めるか、クライアントアプリ側で
ゴリゴリやるかになると思います。

972 :NAME IS NULL:2012/07/27(金) 19:10:02.82 ID:???
いやそれ、SQLでゴリゴリやる内容じゃないと思うぞ。

973 :NAME IS NULL:2012/07/27(金) 19:40:57.39 ID:???
休憩時間じゃなくて、実働時間をもたせたら
実働時間のサマリが指定時間を超える最大のものとかで求まらんかな

974 :NAME IS NULL:2012/07/29(日) 00:41:03.59 ID:???
データベース:MySQL 5.1

ストアドファンクションを作成しているのですが、
ストアド内ではGetDate()は使用できないのでしょうか?
また、何か代替のものはあるのでしょうか?

初歩的な質問で申し訳ありません。


975 :NAME IS NULL:2012/07/29(日) 19:49:26.46 ID:???
WHERE句の(+)ってどういう意味なのですか?
ぐぐっても出なかったもので(^_^;)

976 :NAME IS NULL:2012/07/29(日) 20:02:30.69 ID:???
Oracleだと外部結合演算子でググれ
他は知らん

977 :NAME IS NULL:2012/07/29(日) 20:38:52.00 ID:???
Oracle方言でしょ、それ

978 :NAME IS NULL:2012/07/29(日) 20:59:27.96 ID:???
>>976-977
ありがとうございました。

979 :965:2012/07/30(月) 11:43:54.03 ID:???
やはり簡単にはいかないようですね。

休みの間も考えたのですが、どうもうまくいかないので、結局、ワークテーブルを使って、
Excelでやるような累計をしながら、Functionで実装することにしました。
方針は、>>973さんの方法です。

考えて下さった方、ありがとうございました。

980 :NAME IS NULL:2012/07/31(火) 12:36:18.52 ID:RZdi1fDI
・Microsoft SQL2012を使っています。ちょっと質問なのですが

テーブル作成時における検査制約で、とある列の列名の長さ
が”6文字以内”という可変長の条件にしたいのですがどのよう
に書けばよいのでしょうか?

CONSTRAINT CK_stor_id CHECK(stor_id >=6 ))

上記では間違いでしょうか?よろしくお願いします。


981 :NAME IS NULL:2012/07/31(火) 13:42:13.86 ID:???
なぜ試して見ないの?

982 :NAME IS NULL:2012/07/31(火) 19:22:20.34 ID:???
間違いだろうね。

983 :NAME IS NULL:2012/07/31(火) 20:40:25.97 ID:???
列名の長さ?

318 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)