1

我需要过滤掉 SQL (SQL Server 2008) 表中的垃圾数据。我需要找出这些记录,然后把它们拿出来。

  • 字符[0] = A..Z, a..z
  • 字符[1] = 0..9
  • 字符[2] = 0..9
  • 字符[3] = 0..9
  • 字符[4] = 0..9

{不允许有空格}

基本上,干净的记录将如下所示:

  • T1234、U2468、K123、P50054(4 个记录示例)

垃圾数据如下所示:

  • T12..、.T12、MARK、TP1、SP2、BFGL、BFPL(7 个记录示例)

有人可以协助使用 SQL 查询来执行 LEFT 和 RIGHT 方法并提取这些字符,然后执行 LIKE IN 或其他操作吗?

一个功能会很棒!

4

4 回答 4

4

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

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+,那么使用以下(在 SQL 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

要将其合并到 SQL 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

...并像这样调用它:

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

...此查询需要针对 Oracle 查询进行更改,因为 Oracle 似乎不支持 LIKE 子句中的括号表示法:

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

这是 gbn 在他的回答中所做的扩展,但是这些版本允许在没有 OR 条件的情况下改变字符串长度。

编辑:更新以支持 SQL Server 和 Oracle 中的示例,以确保格式 A0+,以便 A1324、A2342388 和 P2342 匹配,但 A2342JUNK 和 A234 不匹配。

Oracle REGEXP_LIKE 代码是从 Mark 的帖子中借用的,但已更新为支持 4 个或更多数字。

添加了实现这些技术的自定义 SQL Server 2008 方法。

于 2009-09-13T09:47:44.573 回答
2

取决于你的数据库。许多具有正则表达式功能(注意示例未经过测试,因此请检查)

例如甲骨文

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

Sybase 使用 LIKE

于 2009-09-13T09:39:44.090 回答
2

鉴于您在示例中允许使用 3 到 6 位数字,那么从第 2 个字符开始使用 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函数。

另请注意:

  • 我已将第二部分的数字限制为最多 50 个字符,请根据您的需要进行更改。
  • 严格来说,您应该检查货币符号等,因为 ISNUMERIC 允许它们,以及 +/- 和其他一些

更好的选择可能是创建一个函数来检查第一个字符之后的每个字符是否介于 0 和 9 之间(如果使用 ASCII 代码,则为 1 和 0)。

于 2009-09-13T10:30:01.087 回答
2

您不能在 SQL Server 中使用正则表达式,因此您必须使用 OR。纠正大卫安德烈斯的回答......

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”通过

如果您不区分大小写,您也只需要“[AZ]”

于 2009-09-13T11:27:04.420 回答