我需要过滤垃圾数据在SQL(SQL服务器2008年)表。我需要确定这些记录,并把他们拉出来的。

  • Char[0]=A..Z,z..
  • Char[1]=0..9
  • Char[2]=0..9
  • Char[3]=0..9
  • Char[4]=0..9

{没有空白允许}

基本上,一个干净的记录就是这样的:

  • T1234,U2468,K123,P50054(4条记录的实例)

垃圾数据看起来是这样的:

  • T12..,.T12、标记、TP1、SP2,BFGL,BFPL(7记录的实例)

有人可以请协助SQL query做一个左右的方法和提取这些字符,并且做的一样的东西?

一个功能将是巨大的,但!

有帮助吗?

解决方案

以下应该在工作的几个不同的系统:

SELECT * 
FROM TheTable
WHERE Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9]%'
AND Data NOT LIKE '% %'

这种方法将事实上的匹配P2343,P23423JUNK和其他类似的案文,但要求的格式是A0000*.

现在,如果运意味着格式中的位置1个性和所有后续职位是数字,因为在A0+,则使用以下(在SQL服务器和一个很好的处理的其他数据库系统):

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

将这一成SQL服务器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

...并呼吁成就像这样:

SELECT * 
FROM TheTable
WHERE dbo.ufn_IsProperFormat(Data) = 1

...这个查询需要改变为Oracle查询,因为Oracle似乎不支持括号中等条款:

SELECT *
FROM TheTable
WHERE REGEXP_LIKE(Data, '^[A-za-z]\d{4,}$')

这是扩大及是在做他的回答,但是这些版本可以使用不同的字符串的长度没有或条件。

编辑:更新,以支助实例在SQL服务器和Oracle对于确保格式A0+,以便A1324,A2342388,并P2342匹配,但A2342JUNK和A234不这样做。

Oracle REGEXP_LIKE码是借用了标记的职位,但更新,以支持4个或更多个数字。

增加一个自定义SQL服务器2008年的做法实现了这些技术。

其他提示

取决于你的数据库。许多有regex functions(注意的例子没有经过测试以检查)

例如Oracle

SELECT x
 FROM table
 WHERE REGEXP_LIKE(x, '^[A-za-z][:digit:]{4}$')

Sybase使用像

鉴于你在允许之间的3和6位数编号在你的实例,然后它可能更好地使用ISNUMERIC()function2号角之后:

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 '%.%'

更多的信息来看看 ISNUMERIC 功能上MSDN。

还注意:

  • 我已经有限的第2部分的数量为50字最大,改变这种到满足你的需要。
  • 严格来说你应该检查货币符号等,作为ISNUMERIC允许他们,以及+/-和一些其他人

一个更好的选择可能是创建一个函数,检查每个角色之后的第一是介于0和9(或1和0如果你使用ASCII码)。

你不能使用普通的表达在SQL服务器,所以你必须使用或.更正大卫*安德烈斯岛'的答案...

WHERE
    (
    Data LIKE '[A-Za-z][0-9][0-9][0-9]'
    OR
    Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9]'
    OR
    Data LIKE '[A-Za-z][0-9][0-9][0-9][0-9][0-9]'
    )

大卫的答案允许"D1234junk"通过

你也只需要"[A-Z]"如果你没有的情况下灵敏度

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top