首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询-左1= char,右3-5 =名称中的数字

SQL查询-左1= char,右3-5 =名称中的数字
EN

Stack Overflow用户
提问于 2009-09-13 09:34:49
回答 4查看 6.5K关注 0票数 1

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

  • Char =A.z,a.z
  • Char1 = 0..9
  • Char2 = 0..9
  • Char3 = 0..9
  • Char4 = 0..9

{不允许空白}

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

  • T1234,U2468,K123,P50054 (4个记录例子)

垃圾数据如下所示:

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

有人能帮助SQL查询做左和右的方法,并提取这些字符,并执行类似的IN或其他吗?

不过,一个功能会很棒!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-13 09:47:44

以下内容应适用于几个不同的系统:

代码语言:javascript
复制
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和许多其他数据库系统中):

代码语言:javascript
复制
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函数中,因为这似乎是您最想要的,您可以编写:

代码语言:javascript
复制
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像这样调用它:

代码语言:javascript
复制
SELECT * 
FROM TheTable
WHERE dbo.ufn_IsProperFormat(Data) = 1

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

代码语言:javascript
复制
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方法。

票数 4
EN

Stack Overflow用户

发布于 2009-09-13 09:39:44

取决于你的数据库。许多人都有regex函数(注意没有经过测试的例子,请检查)

例如甲骨文

代码语言:javascript
复制
SELECT x
 FROM table
 WHERE REGEXP_LIKE(x, '^[A-za-z][:digit:]{4}$')

Sybase使用类似的

票数 2
EN

Stack Overflow用户

发布于 2009-09-13 10:30:01

假设示例中的数字允许在3到6位之间,那么最好在第二个字符上使用ISNUMERIC()函数:

代码语言:javascript
复制
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)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1417301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档