大家好
小弟遇到一個問題
我想要撈取指定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]'
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) '%'
喔喔喔! 主動前後給他分隔符號再進行搜尋! 這是個好思路
另外麻煩的是對方分隔符號沒統一....有的是用'\n',有的參雜空白...
所以暫時比較偏好於用regexp來處理,只要前後不是數字即可,但不知怎麼處理
',' + ips + ','
不是有考慮到若IP在最前面或最後面的情況嗎。
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=0baafaf00b7c54b91e228c9c69096298
沒統一的話@@...
就只能慢慢增加判斷了~
懶的判斷...改用是否為數字來判斷,借您的思路調整了一下
(mysql語法)
WHERE CONCAT(' ', ips, ' ') REGEXP '[^0-9]92.168.1.2[^0-9]'
你IPS內容每個IP是用逗號來隔嗎?
用SPLIT 逗號 ~ 來切割再抓正確值呢?
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:]+])';
很醜....但是測試過似乎可以..
希望有大神可以幫忙優化
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