如何选择行,其中一列包含

问题描述:

这里是我的表中的字段如何选择行,其中一列包含

service_field

我该如何选择行,其中一列只包含5个,不是15 如果SELECT * FROM厂商WHERE服务LIKE '%5%'它将选择有15个。 有什么想法?

+6

如果您可以控制数据库结构,则需要[标准化](http://en.wikipedia.org/wiki/Database_normalization)。 – BoltClock

+1

正常吗? – Randy

使用正则表达式:

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

(我刚刚在Match tags in MYSQL回答了这个)

正如其他评论指出的,规范化你的数据库。但是,这里有一个黑客,让你在找什么暂时:

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

如果只有5个,那么什么? – DShah

+1

这就是'''周围的服务。如果它只有5个,它使列数据“5,”因此找到5。 –

+0

@Derek哦,我明白了你在那里做了什么。 +1因为聪明 –

SELECT * FROM供应商那里服务='5'或服务LIKE'5,%'或服务如'%,5'或服务LIKE'%,5,%'

但严重标准化DB

你可以做什么是where条件,你可以写services='5' or services like '%,5' or services like '%,5,%' or services like '5,%'

您可以使用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,' 

实际上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) 

但还是要小心 - 这样的设计可能会导致低性能。