teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

function

2017/04/25 08:33

投稿

yambejp
yambejp

スコア117923

answer CHANGED
@@ -37,4 +37,33 @@
37
37
  ,'-','')
38
38
  ,'*','') like '%ジョニーデップ%'
39
39
 
40
+ ```
41
+
42
+ # function
43
+ 汎用性のためfunctionを使います
44
+ まずストアードファンクション(replace2)を作成します
45
+ ```sql
46
+ drop function if exists replace2;
47
+ delimiter //
48
+ create function replace2(str varchar(255), pattern varchar(20), replacement varchar(20)) returns varchar(255) DETERMINISTIC
49
+ begin
50
+ DECLARE x INT DEFAULT 0;
51
+ DECLARE i INT DEFAULT 1;
52
+ set x=length(pattern);
53
+ while i<=x
54
+ do
55
+ set str=replace(str,substr(pattern,i,1),replacement);
56
+ set i=i+1;
57
+ end while;
58
+ return str;
59
+ end
60
+ //
61
+ delimiter ;
62
+
63
+ ```
64
+ functionを利用した実行
65
+ ```sql
66
+ select no
67
+ ,name from tb_actor
68
+ where replace2(name,'・$#_-*','') like '%ジョニーデップ%';
40
69
  ```

1

追記

2017/04/25 08:33

投稿

yambejp
yambejp

スコア117923

answer CHANGED
@@ -1,4 +1,40 @@
1
1
  たとえば「ジョニー・デップ」で「ジョ・ニーデップ 」までヒットして良いかという問題です。
2
2
  問題ないならreplaceを利用して「ジョニーデップ 」に加工した後、
3
3
  ヒットさせればよいですが、インデックスなど効かないのであまり
4
- 効率的な検索にはなりません。
4
+ 効率的な検索にはなりません。
5
+
6
+ # 追記
7
+
8
+ ```SQL
9
+ create table tb_actor(no int unique,name varchar(30));
10
+
11
+ insert into tb_actor values
12
+ (1,'ジョニー・デップ'),
13
+ (2,'ジョニーデップ'),
14
+ (3,'ジョニー/デップ'),
15
+ (4,'ジョ#ニーデップ'),
16
+ (5,'ジ__・--ョ$ニ#$$ー_デ-ッ******プ'),
17
+ (6,'ジョ・ニーデップ'),
18
+ (11,'オーランド・ブルーム'),
19
+ (21,'ハリー・ポッター');
20
+
21
+ ```
22
+
23
+ として、「・#_-$*」を除く場合こんな感じ
24
+ ```ここに言語を入力
25
+ select no
26
+ ,name from tb_actor
27
+ where
28
+ replace(
29
+ replace(
30
+ replace(
31
+ replace(
32
+ replace(
33
+ replace(name,'・','')
34
+ ,'$','')
35
+ ,'#','')
36
+ ,'_','')
37
+ ,'-','')
38
+ ,'*','') like '%ジョニーデップ%'
39
+
40
+ ```