【问题标题】:MySQL native similar to PHP substr_count()MySQL 原生类似于 PHP substr_count()
【发布时间】:2013-10-10 23:33:08
【问题描述】:

MySQL中有没有类似PHP的函数substr_count()的函数? 实际上我需要知道一组中有多少项(例如1,2,3 是 3 项)。

在搜索中,我没有发现任何与此相关的内容。所以我用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 的数量。我有这个值,但我想知道是否有本地方法可以做到这一点,或者比我做的成本更低。

【问题讨论】:

  • 使用 CHAR_LENGTH 而不是 LENGTH。
  • 如果您遇到此类问题,那么您选择了错误的数据类型和/或错误的架构设计。我建议您重新设计,而不是让自己复杂化这个问题。
  • @MostyMostacho 我必须存储一些数字来引用其他表的数据。我知道最好的方法是创建一个“表连接器”(用户、用户扇区、扇区)。但就我而言,它会变得更难工作。如何无法从该表中删除任何数据,因此我不需要为项目的这一步在它们之间设置 FK。但我感谢你的帮助。 :)
  • @DavidRodrigues 100,200 有 3 个项目如何?为什么1,2,3也有3个项目...矛盾,请解释,谢谢
  • 我做了和你一样的把戏 b4 我认为它应该比这更好(一些原生函数等)......但我没有找到更好的东西。我需要它在包含仅整数数组的非 JSON 字段中。

标签: php mysql


【解决方案1】:

没有任何本机功能,您可以这样做。但是为了减轻一些痛苦并隐藏查询中的复杂性,您可以创建处理 NULLs、空字符串等的 on 函数。

类似的东西

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;

样本输出:

|身份证 | NUMBER_OF_VALUES | |----|------------------| | 1 | 3 | | 2 | 2 | | 3 | 6 | | 4 | 0 | | 5 | 0 |

这里是SQLFiddle演示

【讨论】:

    【解决方案2】:

    这可能会解决问题

    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 也可以)

    【讨论】:

    • 这不是只有9 有效吗?即"9,10" 会给出 3 而不是预期的 2。
    • @MartyWallace 9 的意思是?
    • 我可能误解了这个问题。我以为 OP 想知道如果你在 , 拆分有多少项目。
    • @MartyWallace 不,我认为它可以正常工作,因为替换是在 ',' 上执行的
    • @FayeqAliKhan 是对的。我想做类似count(split(",", $setData)) 这样的事情,所以,计算替换的数据将在9,10 中计算为3 而不是2,或者在100,200 中计算为6 而不是2。
    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2012-05-09
    • 2017-04-07
    • 2011-11-07
    • 2014-09-09
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多