【问题标题】:SQL how to filter out values with two decimalsSQL如何过滤掉两位小数的值
【发布时间】:2021-09-30 09:32:55
【问题描述】:

如何过滤掉小数点后一位的值。例如,我的列具有值 VP279.27 和 VP 279.27.1 我只想要只有 1 个小数位的数字的值,例如 VP279.27

我将如何在 SQL 中执行此操作?我的 where 过滤器是什么样的?

【问题讨论】:

  • 您正在寻找只有一个点的字符串? where value like '%.%' and value not like '%.%.%'.
  • 你也有VP 279.27.1.2VP 279.27.1.2.3之类的值吗?

标签: mysql sql mysql-workbench


【解决方案1】:

你可以在这里使用REGEXP

SELECT *
FROM yourTable
WHERE col NOT REGEXP '\\.[0-9]+\\.[0-9]+$';

Demo

这里的逻辑是过滤掉任何列值包含 2 个(或更多)点分隔数字的记录。仍然允许只使用一个点后跟一个结束数字。

【讨论】:

  • 还有其他方法吗?以上并未返回所有值
  • 如果没有看到您的数据,我无法帮助您。揭示问题中的实际数据。
【解决方案2】:

对于您问题中的示例数据,您可以使用NOT LIKE

SELECT *
FROM tablename
WHERE col NOT LIKE '%.%.%'

这将过滤掉任何至少有 2 个点的值。

【讨论】:

  • tbh 根据问题,这实际上是一个很好的答案
【解决方案3】:

使用replace会更方便

where length(col) - length(replace(col, '.', '')) = 1

【讨论】:

    【解决方案4】:

    如果你需要匹配中文单词,那么'char_length()'会比'length()'更好。

    SELECT
        * 
    FROM
        `table_name` 
    WHERE
        (char_length(`col_name`) - char_length(replace(`col_name`, '.', ''))) = 1;
    

    【讨论】:

    • 这是对nayi224的回答?您可以在此处将其作为评论发布。但你提出CHAR_LENGTH 是对的。不管是不是汉字,这大约是一个点的字节长度,最好把它算作一个字符,而不是依靠字符串中的一个字节来表示点。
    • 是的,是的。谢谢提醒!我得到了他的答案,所以我想了想……他的答案并不完美,不能适合所有角色。也许我应该在他的评论下回复他,这有利于答案的分类。
    【解决方案5】:

    也可以:

    SELECT * FROM yourTable
    WHERE col = SUBSTRING_INDEX(col,'.',2);
    

    或者,你真正想要的不是WHERE中的条件:

    SELECT col, SUBSTRING_INDEX(col,'.',2) FROM yourTable;
    

    【讨论】:

      【解决方案6】:

      我的看法:

      select *
      from yourTable
      where col regexp '^[^\.]*\.[^\.]*$';
      

      做得好?

      演示 -> http://sqlfiddle.com/#!9/dacd57/1

      【讨论】:

        猜你喜欢
        • 2022-09-22
        • 1970-01-01
        • 2021-11-23
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 2014-09-19
        • 1970-01-01
        相关资源
        最近更新 更多