iT邦幫忙

0

SQL LIKE 有上千種字元要怎麼處裡

sql

假如下面這是 SQL 資料表 , 以後我會將實際的 EXCEL 匯到 MYSQL 做查詢
https://ithelp.ithome.com.tw/upload/images/20180923/20104326w79fVnBHrF.png

如果地址的安和跟姓名的安和相同 , 這時候取出這兩個人 , 這個查詢可以做到 , 但是當地址的字元跟姓名的字元有上千時 , 我要如何找出這兩個欄位相同之處然後取出呢 ? 難道只能將上千字元都打入 , 然後抓取符合之處取出嗎 ? 還是當這兩個欄位有兩個字相符合時就取出 , 至於是那兩個字就不得而知 , 有辦法這樣設定嗎 ?

看更多先前的討論...收起先前的討論...
蟹老闆 iT邦大師 1 級 ‧ 2018-09-23 14:58:43 檢舉
我要如何找出這兩個欄位相同之處然後取出呢 ? 難道只能將上千字元都打入 , 然後抓取符合之處取出嗎 ?<-是
還是當這兩個欄位有兩個字相符合時就取出 , 至於是那兩個字就不得而知 , 有辦法這樣設定嗎 ?<-可以,另建一個數十萬筆或數百萬筆的資料庫去猜測

這裡的資訊可以先參考,參考完再開始你所想的
https://www.uuu.com.tw/Course/Show/63/%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88%E5%9F%BA%E6%9C%AC%E6%A6%82%E8%AB%96
raytracy iT邦大神 1 級 ‧ 2018-09-23 20:54:23 檢舉
能不能先說: 這樣做的目的是為了甚麼?

或許不一定要用這樣的方法達到你的目的...
77012904 iT邦新手 3 級 ‧ 2018-09-23 23:00:23 檢舉
請用Regular Expression 。 不過很多時候是你資料庫設計得不好,以至於你很難快速找出你想要的資料。 如果你只是為了將資料庫正規化,而要做你問題中所敘述的事情,那用最笨的方式讓它慢慢跑也無妨~
alex9453 iT邦新手 3 級 ‧ 2018-09-23 23:49:28 檢舉
蟹老闆 之前上過課 , 效果不好 , 自修效果比較好 raytracy 我就是要取兩個欄位相同之處 , 再做不同的處裡 , 其餘欄位沒有這個問題 77012904 Regular Expression 這個還是要設定資料比對 , 但是我沒有固定的資料可比對 , 這個資料是隨機的 , 中文字應該有上萬字吧 ! 怎麼設定固定資料
蟹老闆 iT邦大師 1 級 ‧ 2018-09-24 01:40:34 檢舉
老師有好有壞,教法有很多不見得適合每個人,效果好不好大多成份在自己,老師只是引進門,不是課上一上就算了回家也得練習,自我學習是精進的必要步驟,有老師指導是更好的一個方法,你的耐力是我所不及的但應該找個更有效率的方式,
很久了!什麼該問什麼不該問都無法釐清很難有所成果,

你應該把握這次機會,而不是把機會當動力,要了解沒糖吃是很快就會消退的。
alex9453 iT邦新手 3 級 ‧ 2018-09-24 03:45:16 檢舉
什麼機會
wwx iT邦好手 1 級 ‧ 2018-09-24 13:37:05 檢舉
感覺像是描述上的問題,
- 當地址的字元跟姓名的字元有上千時 -
應該是指兩個欄位可用的字有上千上萬種可能,
但欄位長度是畢竟有限的,
應該不是指名字或地址內容會有上千個字那麼長吧...
假設用名字3個字'蔡安合'來舉例,
地址要包含'蔡安合'3個字相連與順序完全符合,只有1種
'蔡安合'
如果要含有2個字相連與順序完全符合的內容則是2種
'蔡安','安合'

如果規律比較不鬆散,
例如2個字的可以變成排列組合就有6種
'蔡安','蔡合','安合','安蔡','合蔡','合安'
意思是地址只要包含有這樣的內容就要被選出?

規律再更鬆散,2個字的不用相連
只要同時出現,就會是這樣的3種
1.地址中同時有 '蔡'和'安'
2.地址中同時有 '蔡'和'合'
3.地址中同時有 '安'和'合'
然後要過濾
地址中同時有 '蔡'和'安'與'合'的會在上述3種中重複出現,
也可以先挑同時有3字的,再從剩餘的部分去找上述3種
...
所以 ...
只要能確定好規律性就能進下一步...
alex9453 iT邦新手 3 級 ‧ 2018-09-24 17:38:17 檢舉
誤按了
alex9453 iT邦新手 3 級 ‧ 2018-09-24 17:38:17 檢舉
謝謝你耐心分析 , 也就是順序與文字要一樣 , 地址 安和 名字也是安和 , 由左到右才被挑出 , 上千個字是指文字有上千種變化 , 不是指名字或地址內容會有上千個字那麼長 , 另外請問 , 可以統計名字出現幾次 , 在第幾張出現的 , 我怕重複讀取同樣事情 , 名字是會重覆幾次 , 但不能是同樣的事情 , 因為我是要從約 1000 位姓名安排列印輸出 , 一張 10 位共約 100 張 , COUNT 可以算個別姓名出現次數 , 但出現在哪 , 無法算 , 我要比對同樣的事件有沒有重覆 , 1000位姓名要比對很久 , 有其他好方法嗎 ?
alex9453 iT邦新手 3 級 ‧ 2018-09-25 08:56:34 檢舉
我看只有從上千字中找出常發生的字元做比對 , 另外對於同樣事件會有重複的問題 , 我想當 A 讀取完後 , 就刪除 A 資料庫資料 , 這樣下次就不會有 A 讀取的事情發生 , 也就不會有重複讀取的情形產生
蟹老闆 iT邦大師 1 級 ‧ 2018-09-25 11:48:40 檢舉
你不是想幫朋友做這個,這就是機會,若想獨佔先接下來人工作業,再想辨法寫出程式,
或直接找人合作,讓會寫的去寫....
不接下來,想靠這個當動力別人我不了解,你會很難。
alex9453 iT邦新手 3 級 ‧ 2018-09-25 13:16:31 檢舉
我是先寫出來,再去接,我現在每天想怎麼做,就是很大的動力,我要學寫程式,找別人寫,我永遠不會寫
其實啊!!!!你這樣的需求很常見的。這種東西叫做多重欄位搜尋。
比較笨的方式用like。進階點的用Regular Expression處理。
再來就是使用全文索引處理。但全文索引對中文字不好,一般是需要做一下特殊的手法才行的。

只是,這算是更高階的應用手法。我不認為你有辦法做這樣的應用。
因為這要進行的手續太多了。

我想,你先使用like的方式就好了

2 個回答

0

地址的安和跟姓名的安相同, 這時候取出這兩個人,是指要取出第1 和第2 筆資料嗎?

簡單的方式是以姓名為索引,再去比對地址,
將所有人姓名的字取出,排除重覆並記錄每個字所屬的筆數(位置),
再將這些字逐一比對地址是否有相同字元,有的話再記錄比對到的地址筆數(位置),
因為你的條件是哪個字有相同的情況下取出筆數,所以每個字的比對結果都是獨立的,
有多少字就有多少結果,這樣是很正常的,當然也不用去手動打字搜尋,一次就能夠處理完。

0
gn00044255
iT邦新手 5 級 ‧ 2018-09-26 15:34:40

這個不難壓
1.取人名字串長度Len
2.做for(int i=0;i<Len;i++)的迴圈
3.取每個字元 str=名字.substring(i,1)
4.取包含 if(地址.Contain(str)){你想做的事}
5.解決

我要發表回答

立即登入回答