2011-08-26 80 views
0

這裏是我的表中的字段如何選擇行,其中一列包含

service_field

我該如何選擇行,其中一列只包含5個,不是15 如果SELECT * FROM廠商WHERE服務LIKE '%5%'它將選擇有15個。 有什麼想法?

+6

如果您可以控制數據庫結構,則需要[標準化](http://en.wikipedia.org/wiki/Database_normalization)。 – BoltClock

+1

正常嗎? – Randy

回答

0

使用正則表達式:

SELECT * FROM `VENDOR` WHERE `services` REGEXP '[[:<:]]5[[:>:]]'; 

(我剛剛在Match tags in MYSQL回答了這個)

5

正如其他評論指出的,規範化你的數據庫。但是,這裏有一個黑客,讓你在找什麼暫時:

select * from vendor where ',' + services + ',' like '%,5,%' 
+0

如果只有5個,那麼什麼? – DShah

+1

這就是'''周圍的服務。如果它只有5個,它使列數據「5,」因此找到5。 –

+0

@Derek哦,我明白了你在那裏做了什麼。 +1因爲聰明 –

1

SELECT * FROM供應商那裏服務='5'或服務LIKE'5,%'或服務如'%,5'或服務LIKE'%,5,%'

但嚴重標準化DB

0

你可以做什麼是where條件,你可以寫services='5' or services like '%,5' or services like '%,5,%' or services like '5,%'

1

您可以使用regexp

select * from my_table 
    where 
    my_col regexp '^5$' or 
    my_col regexp ',5$' or 
    my_col regexp ',5,'; 

沒有嘗試過上述表達自己,但這樣的事情會工作。

編輯:與一個正則表達式:

select * from my_table 
    where 
    my_col regexp '^5$|,5$|,5,' 
1

實際上MySQL提供了FIND_IN_SETfunction用於這種逗號分隔的字符串。這是一個比複雜like或正則表達式的解決方案簡單和清晰:

mysql> select * from vendor where find_in_set('5', services) > 0; 
+----+----------+ 
| id | services | 
+----+----------+ 
| 1 | 5  | 
| 3 | 9,5  | 
+----+----------+ 
2 rows in set (0.00 sec) 

但還是要小心 - 這樣的設計可能會導致低性能。

相關問題