2016-11-08 60 views
-2

這是行選項columnoc_cart選擇INT列,並將其與JSON數組列比較

20,228,27,229 

爲什麼沒有發現,當值是228,但結果發現,結果當值的20象下面這樣:

select 1 from dual 
where 228 in (select option as option from oc_cart) 

和結果發現當我改變值至20像

select 1 from dual 
where 20 in (select option as option from oc_cart) 

所述option列的數據類型是TEXT

回答

1

在SQL中,這兩個表達式是不同的:

WHERE 228 in ('20,228,27,229') 

WHERE 228 in ('20','228','27','229') 

的第一示例中的整數228進行比較,以一個字符串值,其導致數字字符可以被轉換爲整數20.那就是發生了什麼事。 228與20比較,並失敗。

第二個例子的整數228進行比較,以四個值的列表,每一個都可以被轉化爲不同的整數,和228相匹配的第二整數228

你的子查詢返回單個字符串,而不是列表值。如果您的oc_cart.option只包含一個字符串,則不能以您所做的方式使用謂詞IN()

一種解決方法是這樣的:

WHERE FIND_IN_SET(228, (SELECT option FROM oc_cart WHERE...)) 

但是,這是尷尬。如果您想搜索字符串中的單個數字,您實際上不應該存儲逗號分隔數字的字符串。請參閱我的回答Is storing a delimited list in a database column really that bad?

+0

問題通過使用FIND_IN_SET解決 –

+0

謝謝MR.Bill –