在示例「匹配」中,匹配的字符在兩個字符串中都處於相同的位置。目前尚不清楚這是否是實際的規格,或者如果這只是示例中的異常情況。另外,我們注意到,在示例數據中,字符列表是不同的,任何字符串中都沒有兩個相同的字符。再次,不確定這是規範的一部分,還是示例中的異常。
此外,代碼值的長度始終是六個字符?對較短的字符串或空格字符進行特殊處理?等
在最簡單的情況下,如果我們通過排名來比較字符串位置,唯一的要求就是一個字等於另一個字符(無特殊處理的空間,或者非字母,等),那麼像這樣將返回指定的結果:
SELECT c.id
, c.code
, d.id
, d.code
FROM mytable c
JOIN mytable d
ON d.id <> c.id
AND (IFNULL(NULLIF(SUBSTR(c.code,1,1),'') = NULLIF(SUBSTR(d.code,1,1),'') ,0)
+ IFNULL(NULLIF(SUBSTR(c.code,2,1),'') = NULLIF(SUBSTR(d.code,2,1),'') ,0)
+ IFNULL(NULLIF(SUBSTR(c.code,3,1),'') = NULLIF(SUBSTR(d.code,3,1),'') ,0)
+ IFNULL(NULLIF(SUBSTR(c.code,4,1),'') = NULLIF(SUBSTR(d.code,4,1),'') ,0)
+ IFNULL(NULLIF(SUBSTR(c.code,5,1),'') = NULLIF(SUBSTR(d.code,5,1),'') ,0)
+ IFNULL(NULLIF(SUBSTR(c.code,6,1),'') = NULLIF(SUBSTR(d.code,6,1),'') ,0)
) >= 4
WHERE c.id = 1
ORDER BY c.id, d.id
如果我們需要每一個字符code
比較各自在對方code
的人物,我們就會有類似的東西,我們剛剛需要執行總共36次比較。 (比較位置1至位置 1,2,3,4,5,6,比較位置2至位置1,2,3,4,5,6)
這可以與查詢完全相同除了謂詞將包含總共36個比較測試,而不僅僅是6個。
這會再次引發字符串中同一字符的倍數問題,以及如何將這些字符「計算」爲匹配。例如,考慮:
code1: QbQdef
code2: QxyQQz
將q在編碼1 1位置碼2匹配三問的,並在編碼1的2位Q也會匹配三問在代碼2 ...爲6總比賽數。我們是否想將這兩個代碼視爲匹配?如果沒有,我們可以稍微修改查詢中的測試塊,以便將位置1中的字符與代碼2中的任何字符進行匹配,只會將1添加到匹配計數中。
爲了確定實現所需結果的實際SQL語句,需要充實更多的規範。
你確定你想這樣做在SQL查詢,而不是一個標準的編程語言? – Jay 2014-09-05 19:21:20
我寧願在sql中比在php中執行它,是的。 – 2014-09-05 19:27:02
有字符串函數來查看每個字符(SUBSTRING) - 但是你必須爲每個4個匹配的排列創建一個CASE - 並且有很多。否則,你會在腳本語言中更好地在MYSQL之外做它。 – user3741598 2014-09-05 19:30:23