iT邦幫忙

0

sql語法詢問

舜~ 2021-09-03 14:43:191597 瀏覽

大家好
小弟遇到一個問題
我想要撈取指定IP的host,但每次都匯撈出多筆...
請問where要如何下才能精確撈出資料??

DB: mysql

host ips
aaa 192.168.1.1,192.168.1.2,192.168.1.3
bbb 92.168.1.1,92.168.1.2,92.168.1.3
ccc 192.168.1.10,192.168.1.20,192.168.1.30
ddd 192.168.1.22,192.168.1.33-vip,192.168.1.44

ps. iT幫的表格用<br>竟然無法換行...我用,代表換行 @@
ps. 對方分隔符號沒有統一...目前發現的分隔符號有...,,(空白), \n,基本上都是換行,難一次全部考慮進去就先考慮換行就好,大部分的先可以即可...

所以目前偏好於用regexp來判斷前後為非數字、開頭或結尾的方式來處理,但不知怎麼下語法

-- 這會跑出多筆資料
select host where ips like '%92.168.1.2%'

-- 這也無法只撈出bbb
select host where ips REGEXP '92\.168\.1\.2[^\d]'

請問一下各位前輩,
以我的案例where要如何下才能精確撈出資料??


目前處理方式
(參考純真的人的思路)
WHERE CONCAT(' ', ips, ' ') REGEXP '[^0-9]92.168.1.2[^0-9]'

/192.168.1.21/m 加flag呢?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
純真的人
iT邦大師 1 級 ‧ 2021-09-03 15:09:11
最佳解答

MSSQL我是這麼下的~

select host where ',' + ips + ',' like '%,92.168.1.2,%'

如果是BR斷行

select host where chr(13) + chr(10) + ips + chr(13) + chr(10) like '%' + chr(13) + chr(10) + '92.168.1.2' + chr(13) + chr(10) '%'
看更多先前的回應...收起先前的回應...
舜~ iT邦高手 1 級 ‧ 2021-09-03 15:14:24 檢舉

喔喔喔! 主動前後給他分隔符號再進行搜尋! 這是個好思路

另外麻煩的是對方分隔符號沒統一....有的是用'\n',有的參雜空白...
所以暫時比較偏好於用regexp來處理,只要前後不是數字即可,但不知怎麼處理

vic0629 iT邦研究生 4 級 ‧ 2021-09-03 15:49:40 檢舉
',' + ips + ','

不是有考慮到若IP在最前面或最後面的情況嗎。
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=0baafaf00b7c54b91e228c9c69096298

沒統一的話@@...
就只能慢慢增加判斷了~

舜~ iT邦高手 1 級 ‧ 2021-09-03 22:35:30 檢舉

懶的判斷...改用是否為數字來判斷,借您的思路調整了一下
(mysql語法)
WHERE CONCAT(' ', ips, ' ') REGEXP '[^0-9]92.168.1.2[^0-9]'

0
緯大啊緯大人
iT邦研究生 1 級 ‧ 2021-09-03 15:01:08

你IPS內容每個IP是用逗號來隔嗎?

用SPLIT 逗號 ~ 來切割再抓正確值呢?

舜~ iT邦高手 1 級 ‧ 2021-09-03 15:19:05 檢舉

很可惜對方分隔符號沒有統一...目前發現的分隔符號有...,,(空白), \n,大部分是換行

好髒XDDD 我先去吐/images/emoticon/emoticon01.gif

舜~ iT邦高手 1 級 ‧ 2021-09-03 22:36:08 檢舉

1
Hankz
iT邦新手 2 級 ‧ 2021-09-03 18:52:18
SELECT * FROM search_regexp WHERE ips REGEXP '(^192\.168\.1\.1$)|(^192\.168\.1\.1[^[:digit:]+])|([^[:digit:]+]192\.168\.1\.1$)|([^[:digit:]+]192\.168\.1\.1[^[:digit:]+])';

很醜....但是測試過似乎可以..
希望有大神可以幫忙優化

舜~ iT邦高手 1 級 ‧ 2021-09-03 22:32:18 檢舉

雖然醜了點但確實可行~
剛知道還有這種語法[:digit:]~
學習了~

1
vic0629
iT邦研究生 4 級 ‧ 2021-09-03 22:12:09
select host from Tmp where ',' + ips + ',' like '%[^0-9][9][2][.][1][6][8][.][1][.][1][^0-9]%'

之前的思路加上分隔符號必非為數字,麻煩試試能否行。
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=3174011fb836c7e66807139403824d1e

舜~ iT邦高手 1 級 ‧ 2021-09-03 22:40:21 檢舉

感謝,不過like在mysql上沒辦法這麼用,改用REGEXP再進行微調就可以了動了~
WHERE CONCAT(' ', ips, ' ') REGEXP '[^0-9]92.168.1.2[^0-9]'

我要發表回答

立即登入回答