SQL query-左1=char,对3至5=数字的名称
-
07-07-2019 - |
题
我需要过滤垃圾数据在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]"如果你没有的情况下灵敏度