【发布时间】:2011-07-06 06:53:34
【问题描述】:
我有一个名为customers 的表,其中有一个名为telnumber 的字段。
telnumber 包含一个电话号码,但确实包含一些无效数据。所以我想从客户表中选择数据,字段 telnumber 的值在 9 到 11 之间,并且是数字。
【问题讨论】:
-
你试过什么? SO 社区希望您在获得帮助之前表现出一些努力。
我有一个名为customers 的表,其中有一个名为telnumber 的字段。
telnumber 包含一个电话号码,但确实包含一些无效数据。所以我想从客户表中选择数据,字段 telnumber 的值在 9 到 11 之间,并且是数字。
【问题讨论】:
这应该只返回长度在 9 到 11 之间并且是数字的记录。
SELECT * FROM customers
WHERE LENGTH(telnumber) BETWEEN 9 AND 11
AND telnumber REGEXP '^[0-9]+$'
【讨论】:
您对9 and 11 in length and is numeric 的要求意味着您自动拒绝任何常见的“电话号码标点符号”,例如破折号、空格和括号。您的telnumber 字段实际上可能包含正确的“标点”电话号码。我认为更完整的解决方案是使用MySQL's RegEx 来测试有效的电话号码。
这里有另一个SO question/answer,可以帮助您开始并考虑替代方案。
【讨论】:
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]+$'
【讨论】:
BETWEEN 到 >= AND <=?
如果我们看一下here 并使用 LENGTH(),一个简单的查询将如下所示:
SELECT * FROM customers WHERE (LENGTH(telnumber) > 9) AND (LENGTH(telnumber) < 11)
这可以扩展以满足您的需要。
【讨论】:
您可以使用此存储过程来确定它是否为数字数据类型:
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
【讨论】:
我不是mySql专家,但我认为你可以简单地使用:
SELECT *
FROM customers
WHERE CONVERT(telnumber, INTEGER) IS NOT NULL
AND LENGTH(telnumber) >= 9
AND LENGTH(telnumber) <= 11;
【讨论】: