2009-05-05 54 views
1

我有一個比較我想在SQL中提高效率。Sql Un-Wizardry:比較另一個列表中的值

輸入字段(fldInputField)是逗號分隔的 「1,3,4,5」

該數據庫的列表具有字段(fldRoleList),其中包含「1,2,3,4,5, 6,7,8「

因此,對於fldRoleList中第一次出現的fldInputField,告訴我們它是哪個值。

有沒有辦法在MySQL或存儲過程中實現以下功能?

僞代碼

SELECT * FROM T1 aTable WHERE 在fldInputField t1.fldRoleList

/僞代碼

我猜測可能有一些功能是最適合這種比較?我在搜索中找不到任何東西,如果有人能指導我,我會刪除這個問題......謝謝!

更新:這不是理想的(或好的)做事情的方式。它是繼承的代碼,我們只是簡單地試圖快速修復,而我們看着構建邏輯來通過規範化的行來處理這個問題。幸運的是,這不是大量使用的代碼。

+0

我不是你想要的東西完全清楚。你能否給出一些示例值和你期望看到的結果?例如,使用給定的值將正確的結果是「1」,因爲「1」出現在兩個列表中? – 2009-05-05 18:11:44

回答

3

我@Ken白色的answer是逗號分隔的列表同意在一個規範化的數據庫設計的地方。

解決辦法是簡單有更好的表現,如果你存儲在相關表中fldRoleList爲多行:

SELECT t1.*, r1.fldRole 
FROM aTable t1 JOIN aTableRoles r1 USING (aTable_id) 
WHERE FIND_IN_SET(r1.fldRole, fldInputField); 

(見MySQL的函數FIND_IN_SET()

但是,輸出多行如果多個角色匹配逗號分隔的輸入字符串。如果您需要將結果限制爲一行每aTable項,與第一匹配的角色:

SELECT t1.*, MIN(r1.fldRole) AS First_fldRole 
FROM aTable t1 JOIN aTableRoles r1 USING (aTable_id) 
WHERE FIND_IN_SET(r1.fldRole, fldInputField); 
GROUP BY t1.aTable_id; 
2

你有一個可怕的模式設計,你知道。逗號分隔的列表在數據庫中沒有業務。

這就是說...你在找LIKE。

SELECT * FROM aTable t1 WHERE t.fldRoleList LIKE fldInputField + '%' 

如果內容在開始時可能不總是匹配,請在fldInputField之前添加另一個百分號。

SELECT * FROM aTable t1 WHERE t.fldRoleList LIKE '%' + fldInputField + '%' 
+0

或者構建臨時表並執行常規操作。 – dkretz 2009-05-05 18:16:20

+0

如果你正在尋找1,你會發現11使用這種解決方案 – Andomar 2009-05-05 20:12:06

相關問題