2013-10-04 37 views
2

MySQL中有没有类似PHP的函数substr_count()的函数? 其实我需要知道一套中有多少物品(例如1,2,3是3件物品)。与PHP类似的MySQL本机substr_count()

在搜索中,我没有发现任何原生的东西。所以我用方法LENGTH()REPLACE()做了一个解决方法。

SELECT LENGTH("1,2,3,4") - LENGTH(REPLACE("1,2,3,4", ",", "")) + 1; 

但它失败设置为空。
但我可以用简单的IF()来解决这个问题。

所以,我在寻找一些更多的原生一样,例如:

SELECT SUBSTR_COUNT(",", "1,2,3,4") + 1; 

或者,更好:

SELECT LENGTH_OF_SET("1,2,3,4"); 

一些解决方案的家伙?

编辑

因为有些疑惑,我会尽量设置一些例子:

  • 1,2,3有3项:1,2和3;
  • 100,200有2个项目:100和200;
  • 1,2,4,9,16,25有6项:1,2,4,9,16和25;

基本上,我想要的数字是逗号+ 1的数字。我有这个价值,但我想知道是否有一种原生的方式来做到这一点,或者比我的成本更低。

+1

使用CHAR_LENGTH而不是LENGTH。 – sectus

+0

如果您遇到此类问题,那么您选择了错误的数据类型和/或错误的模式设计。我建议你重新设计,而不是让这些问题复杂化。 –

+0

@MostyMostacho我必须存储一些数字来引用其他表的数据。我知道最好的方法是创建一个“表格连接器”(用户,用户扇区)。但在我的情况下,它会变得更难以工作。如何从这个表中删除任何数据,因此我不需要为这个项目的步骤设置FK。但我感谢你的帮助。 :) –

回答

2

没有对任何原生功能,你要做的就是确定。但是为了缓解一些痛苦并隐藏你的查询中的复杂性,你可以创建你的on函数来处理NULL,空字符串等。

像这样的事情

CREATE FUNCTION SUBSTR_COUNT 
(
    _delimiter VARCHAR(12), 
    _value VARCHAR(255) 
) RETURNS INT 
RETURN COALESCE(
     CHAR_LENGTH(NULLIF(_value, '')) 
     - CHAR_LENGTH(REPLACE(NULLIF(_value, ''), COALESCE(_delimiter, ','), '')) 
     + 1, 
     0); 

然后享受它

SELECT id, SUBSTR_COUNT(',', value_set) number_of_values 
    FROM table1; 

SELECT id, SUBSTR_COUNT(NULL, value_set) number_of_values 
    FROM table1; 

输出示例:

 
| ID | NUMBER_OF_VALUES | 
|----|------------------| 
| 1 |    3 | 
| 2 |    2 | 
| 3 |    6 | 
| 4 |    0 | 
| 5 |    0 | 

这里是SQLFiddle演示

1

这可能达到目的

select char_length(REPLACE('1,2,3,4', ',', '')); 

or 

select char_length(REPLACE("1,2,3,4", ",", "")); 

length()返回以字节为单位的字符串的长度。

CHAR_LENGTH()返回以字符度量的字符串长度。

CHARACTER_LENGTH()是CHAR_LENGTH()的同义词。

select char_length(REPLACE('10,2000,3',',','')) from tableName LIMIT 1 

查询正在与CHAR_LENGTH绝对精品!

字符长度:7(即使0计数是确定)

+2

这只能工作到'9'吗?即''9,10“'会给出3而不是预期的2. – Marty

+0

@MartyWallace 9的意思是? –

+1

我可能会误解这个问题。我认为如果你在','分裂了,那么OP想知道有多少物品。 – Marty