回答編集履歴

2

修正

2016/12/21 03:02

投稿

yambejp
yambejp

スコア114863

test CHANGED
@@ -56,7 +56,23 @@
56
56
 
57
57
  可能な限り数値の範囲指定するのが妥当です。
58
58
 
59
+
60
+
61
+ 一応以下のような書き方もあります
62
+
63
+ ```SQL
64
+
65
+ select * from abc where 991=truncate(datas / power(10,9),0)
66
+
67
+ ```
68
+
69
+ ※9というのは12桁から991=3桁を引いた数です。
70
+
71
+ ただし、検索の際にカラムを利用した計算が発生するとやや効率がさがります。
72
+
73
+
74
+
59
- なお一般に数値の範囲はbetweenを利用します
75
+ 一般に数値の範囲はbetweenを利用します
60
76
 
61
77
  数値の範囲ならabcとxyzで結果の相違はありませんのでabcのみ記載します。
62
78
 

1

sample

2016/12/21 03:02

投稿

yambejp
yambejp

スコア114863

test CHANGED
@@ -9,3 +9,95 @@
9
9
 
10
10
 
11
11
  またdatasカラムのデータ型の定義も必要です
12
+
13
+
14
+
15
+ #sample
16
+
17
+ 質問者さんは要件定義をきちんとする癖をつけた方がよいですね。
18
+
19
+ 中途半端な定義はバグの温床になります。
20
+
21
+
22
+
23
+ サンプルつけておきます
24
+
25
+ ```SQL
26
+
27
+ create table abc(datas bigint(12) unsigned zerofill,index(datas));
28
+
29
+ insert into abc values(1),(2),(991),(990000000000),(991000000000),(991000000001),(991000000002);
30
+
31
+ create table xyz(datas bigint(12),index(datas));
32
+
33
+ insert into xyz values(1),(2),(991),(990000000000),(991000000000),(991000000001),(991000000002);
34
+
35
+
36
+
37
+ ```
38
+
39
+
40
+
41
+ zerofillしているかどうかでlikeで取れるかが異なります
42
+
43
+ zerofillしていないxyzは991などもヒットします
44
+
45
+
46
+
47
+ ```SQL
48
+
49
+ select * from abc where datas like '991%';
50
+
51
+ select * from xyz where datas like '991%';
52
+
53
+ ```
54
+
55
+ 数値の抽出にlikeを使うとindexの利用効率が変わります
56
+
57
+ 可能な限り数値の範囲指定するのが妥当です。
58
+
59
+ なお一般に数値の範囲はbetweenを利用します
60
+
61
+ 数値の範囲ならabcとxyzで結果の相違はありませんのでabcのみ記載します。
62
+
63
+
64
+
65
+ ```SQL
66
+
67
+ select * from abc where datas between 991000000000 and 991999999999;
68
+
69
+ ```
70
+
71
+
72
+
73
+ ここで、わざわざ数値を手でいれるのも馬鹿らしいので、
74
+
75
+ 「991」と「12桁」という値を与えて計算させてみます
76
+
77
+
78
+
79
+ ```SQL
80
+
81
+ set @a=991,@b=12;
82
+
83
+ select * from abc where datas between @a*power(10,@b-ceiling(log10(@a))) and (@a+1)*power(10,@b-ceiling(log10(@a)))-1
84
+
85
+ ```
86
+
87
+
88
+
89
+ これを1文で書くと以下になります。
90
+
91
+ ただし、MySQLの場合おなじSQL文中で変数の参照される範囲が定義されていませんので
92
+
93
+ 正しく範囲が指定できない可能性もありますが、ほぼ問題ないでしょう。
94
+
95
+
96
+
97
+ ```SQL
98
+
99
+ select * from abc where datas between (@a:=991)*(@b:=power(10,12-ceiling(log10(@a)))) and (@a+1)*@b -1
100
+
101
+ ```
102
+
103
+