【问题标题】:Selecting data of a certain value选择特定值的数据
【发布时间】:2011-07-06 06:53:34
【问题描述】:

我有一个名为customers 的表,其中有一个名为telnumber 的字段。

telnumber 包含一个电话号码,但确实包含一些无效数据。所以我想从客户表中选择数据,字段 telnumber 的值在 9 到 11 之间,并且是数字。

【问题讨论】:

  • 你试过什么? SO 社区希望您在获得帮助之前表现出一些努力。

标签: mysql sql


【解决方案1】:

这应该只返回长度在 9 到 11 之间并且是数字的记录。

SELECT * FROM customers
WHERE LENGTH(telnumber) BETWEEN 9 AND 11
AND telnumber REGEXP '^[0-9]+$'

【讨论】:

    【解决方案2】:

    您对9 and 11 in length and is numeric 的要求意味着您自动拒绝任何常见的“电话号码标点符号”,例如破折号、空格和括号。您的telnumber 字段实际上可能包含正确的“标点”电话号码。我认为更完整的解决方案是使用MySQL's RegEx 来测试有效的电话号码。

    这里有另一个SO question/answer,可以帮助您开始并考虑替代方案。

    【讨论】:

    • +1,这不是他要问的,但可能是他应该做的。
    【解决方案3】:
    SELECT
      * 
    FROM customers c
    WHERE LENGTH(c.telnumber) BETWEEN 9 AND 11
      AND c.telnumber REGEXP '^[0-9]+$'
    

    SELECT
       *
    FROM customers c
    WHERE LENGTH(c.telnumber) >=9 AND LENGTH(c.telnumber) <= 11
       AND c.telnumber REGEXP '^[0-9]+$'
    

    【讨论】:

    • 测试它是数字怎么样?
    • MySQL 是否针对数值优化 BETWEEN&gt;= AND &lt;=
    • @Abe Regex 负责数字测试
    【解决方案4】:

    如果我们看一下here 并使用 LENGTH(),一个简单的查询将如下所示:

    SELECT * FROM customers WHERE (LENGTH(telnumber) &gt; 9) AND (LENGTH(telnumber) &lt; 11)

    这可以扩展以满足您的需要。

    【讨论】:

    • 太棒了,谢谢...但是有没有办法只从这些结果中获取数字
    • 看看@John 的回答 :-) 他做得比我好一点。
    【解决方案5】:

    您可以使用此存储过程来确定它是否为数字数据类型:

    CREATE FUNCTION dbo.IsNumericEx( @value nvarchar(max) )
    RETURNS BIT
    AS
    BEGIN
         DECLARE @isInt BIT
    
         SELECT  @isInt = 1 
         WHERE   @value NOT LIKE '%[^0-9.-]%'
                 AND LEN(REPLACE(@value, '.', '')) >= LEN(@value) - 1
                 AND CHARINDEX('-', @value) IN (0, 1)
                 AND CHARINDEX('-', @value, 2) = 0
    
         RETURN ISNULL(@isInt, 0)
    END
    GO
    

    还有查询:

    select * from myTable where isNumericEx(mycolumn) = 1 and length(mycolumn) between 9 and 11
    

    【讨论】:

      【解决方案6】:

      我不是mySql专家,但我认为你可以简单地使用:

      SELECT *
      FROM customers
      WHERE CONVERT(telnumber, INTEGER) IS NOT NULL
      AND LENGTH(telnumber) >= 9
      AND LENGTH(telnumber) <= 11;
      

      【讨论】:

        猜你喜欢
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 2021-03-04
        • 2021-05-01
        • 2014-01-13
        • 1970-01-01
        相关资源
        最近更新 更多