亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

mysql字符串比較函數:concat和regexp

添加時間:2014-11-10 0:17:22  添加: 思海網絡 

問題描述

比如table1中有兩條記錄
name no
a 2,9
b 8,10

然后有一串字符串,是0,1,2,3,4

然后通過一條sql,找出no為2,9的記錄來```

因為字符串中有2,數據中也有2

詳細解釋
------------------------------
表的字段就是
name no 
a 2,9 
b 8,10 
字符串是str="0,1,2,3,4"
接下來就是查 no字段里跟str里有交集的記錄
查詢的結果就是name=a的,no=2,9的記錄。

1
2
select * from table1 where
concat(',',no,',') regexp concat(',0,,1,,2,,3,,4,');

或者:

1
2
select * from table1 where
concat(',',no,',') regexp concat(',(',replace('0,1,2,3,4',',',''),'),');

由于某些原因,有時候我們沒有按照范式的設計準則而把一些屬性放到同一個字符串字段中。比如個人興趣,有時候我們設計表為
create table members (uid int primary key,uname varchar(20),hobby varchar(100));


表中內容如下

mysql> select * from members;
+-----+-------+---------------------------------+
uid uname hobby 
+-----+-------+---------------------------------+
1 AAAA 音樂,電影,網絡,籃球,閱讀,乒乓球 
2 BBBB 音樂,閱讀,乒乓球,發呆,圍棋,參禪 
3 CCCC 交友,乒乓球 
4 DDDD 臺球,網絡,看書,旅游 
5 EEEE 音樂,發呆,下圍棋,參禪 
+-----+-------+---------------------------------+
4 rows in set (0.00 sec)

如果我們現在想查找一個與某個用戶X (閱讀,交友,圍棋,足球,滑雪)有著相同愛好的會員記錄 如果來操作呢? 

在其它數據庫中,我們能只通過程序來或者存儲過程來分解這個 "閱讀,交友,圍棋,足球,滑雪" 字符串為單獨的愛好項目,然后一個一個進行 like '%xxxx%' 來查詢。 但在MySQL中我們可以直接利用這個regexp正規表達式 來構造SQL語句來實現。

首先我們把 '閱讀,交友,圍棋,足球,滑雪' 轉換成為正則式 為 '閱讀交友圍棋足球滑雪' , 在正則表達式中為 '或' 的意思

mysql> select replace('閱讀,交友,圍棋,足球,滑雪',',','');
+---------------------------------------------+
replace('閱讀,交友,圍棋,足球,滑雪',',','') 
+---------------------------------------------+
閱讀交友圍棋足球滑雪 
+---------------------------------------------+
1 row in set (0.00 sec)

這樣我們可以用SQL語句如下。
mysql> select * from members where hobby regexp replace('閱讀,交友,圍棋,足球,滑雪',',','');
+-----+-------+---------------------------------+
uid uname hobby 
+-----+-------+---------------------------------+
1 AAAA 音樂,電影,網絡,籃球,閱讀,乒乓球 
2 BBBB 音樂,閱讀,乒乓球,發呆,圍棋,參禪 
3 CCCC 交友,乒乓球 
5 EEEE 音樂,發呆,下圍棋,參禪 
+-----+-------+---------------------------------+
3 rows in set (0.00 sec)


如上語句我們可以通過一句SQL得到所有hobby包含 '閱讀,交友,圍棋,足球,滑雪' 任一項的記錄。

但上述的語句中還有一點小的缺陷,那就是把 '下圍棋' 這一條也選擇了出來,如果精確匹配的話這條記錄不應該被選中。為了避免這種情況,我們對SQL語句做如下改進。


把正則式改為 ',(閱讀交友圍棋足球滑雪),' 也就是要求匹配項前后必須有一個界定符","

mysql> select concat(',(',replace('閱讀,交友,圍棋,足球,滑雪',',',''),'),');
+---------------------------------------------------------------+
concat(',(',replace('閱讀,交友,圍棋,足球,滑雪',',',''),'),') 
+---------------------------------------------------------------+
,(閱讀交友圍棋足球滑雪), 
+---------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from members
-> where concat(',',hobby,',') regexp
-> concat(',(',replace('閱讀,交友,圍棋,足球,滑雪',',',''),'),');
+-----+-------+---------------------------------+
uid uname hobby 
+-----+-------+---------------------------------+
1 AAAA 音樂,電影,網絡,籃球,閱讀,乒乓球 
2 BBBB 音樂,閱讀,乒乓球,發呆,圍棋,參禪 
3 CCCC 交友,乒乓球 
+-----+-------+---------------------------------+
3 rows in set (0.00 sec)

這樣避免了第5條記錄被選中。

關鍵字:mysql、函數、記錄

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站