我需要过滤掉SQL ( Server 2008)表中的垃圾数据。我需要确认这些记录,然后把它们拿出来。
{不允许空白}
基本上,一个干净的记录将如下所示:
垃圾数据如下所示:
有人能帮助SQL查询做左和右的方法,并提取这些字符,并执行类似的IN或其他吗?
不过,一个功能会很棒!
发布于 2009-09-13 09:47:44
以下内容应适用于几个不同的系统:
SELECT *
FROM TheTable
WHERE Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9]%'
AND Data NOT LIKE '% %'此方法确实与P2343、P23423JUNK和其他类似文本相匹配,但要求格式为A0000*。
现在,如果OP意味着第一个位置的格式是一个字符,并且后续的所有位置都是数字的,就像在A0+中那样,那么使用以下方法(在Server和许多其他数据库系统中):
SELECT *
FROM TheTable
WHERE SUBSTRING(Data, 1, 1) LIKE '[A-Za-z]'
AND SUBSTRING(Data, 2, LEN(Data) - 1) NOT LIKE '%[^0-9]%'
AND LEN(Data) >= 5要将它合并到Server 2008函数中,因为这似乎是您最想要的,您可以编写:
CREATE FUNCTION ufn_IsProperFormat(@data VARCHAR(50))
RETURNS BIT
AS
BEGIN
RETURN
CASE
WHEN SUBSTRING(@Data, 1, 1) LIKE '[A-Za-z]'
AND SUBSTRING(@Data, 2, LEN(@Data) - 1) NOT LIKE '%[^0-9]%'
AND LEN(@Data) >= 5 THEN 1
ELSE 0
END
END...and像这样调用它:
SELECT *
FROM TheTable
WHERE dbo.ufn_IsProperFormat(Data) = 1...this查询需要更改Oracle查询,因为Oracle似乎不支持LIKE子句中的括号表示法:
SELECT *
FROM TheTable
WHERE REGEXP_LIKE(Data, '^[A-za-z]\d{4,}$')这是gbn在他的答案中所做的扩展,但是这些版本允许在没有OR条件的情况下改变字符串长度。
编辑:更新后支持Server和Oracle中的示例,以确保A0+格式,以便A1324、A2342388和P2342匹配,但A2342JUNK和A234不匹配。
Oracle REGEXP_LIKE代码是从Mark的帖子中借用的,但经过更新后支持4个或更多数字数字。
添加了实现这些技术的自定义Server 2008方法。
发布于 2009-09-13 09:39:44
取决于你的数据库。许多人都有regex函数(注意没有经过测试的例子,请检查)
例如甲骨文
SELECT x
FROM table
WHERE REGEXP_LIKE(x, '^[A-za-z][:digit:]{4}$')Sybase使用类似的
发布于 2009-09-13 10:30:01
假设示例中的数字允许在3到6位之间,那么最好在第二个字符上使用ISNUMERIC()函数:
SELECT *
FROM TheTable
-- start with a letter
WHERE Data LIKE '[A-Za-z]%'
-- everything from 2nd character onwards is a number
AND ISNUMERIC( SUBSTRING( Data, 2, 50 ) ) = 1
-- number doesn't have a decimal place
AND Data NOT LIKE '%.%'有关更多信息,请参阅MSDN上的ISNUMERIC函数。
还注意到:
更好的选择可能是创建一个函数,检查第一个字符之后的每个字符是否介于0和9之间(如果使用ASCII代码,则检查1和0)。
https://stackoverflow.com/questions/1417301
复制相似问题