返回仅包含一个数字字符的邮政编码(varchars)

时间:2016-09-02 11:14:04

标签: sql sql-server tsql sql-server-2012

我被要求运行一个查询,从一个表格中返回英国邮政编码列表,这些表格中包含电子邮件报告的过滤器,最后只有1个号码。问题是英国的邮政编码长度可变;有些是'AA#'或'AA ##'结构,有些是'A#'或'A ##'。我只想要那些'AA#'或'A#'。

我尝试运行下面的SQL,使用长度和(尝试)使用正则表达式来过滤掉所有与我想要的不匹配的结果,但我对使用范围非常新,但它没有用。< / p>

SELECT PostCode
FROM ReportFilterTable RFT
WHERE RFT.FilterType = 'Postcode' 
AND LEN(RFT.Postcode) < 4 
AND RFT.PostCode LIKE '%[0-9]'

我认为我接近这个的方式是有缺陷的,但我对一个更好的方法毫无头绪。谁能帮助我?

谢谢!

编辑:

由于我原本没有包含任何示例数据,我现在已经在下面这样做了。

这是我正在返回的列中的一种值的示例,其中包含我需要返回的内容以及我不返回的内容的示例。

  • B1 - 应该退回
  • B10 - 不应退还
  • B2 - 应该退回
  • B20 - 不应退还
  • B3 - 应该退回
  • B30 - 不应退回
  • SE1 - 应该退回
  • SE10 - 不应退还

3 个答案:

答案 0 :(得分:1)

如果问题是您获得了多个数字的值,那么您正在使用SQL Server(根据语法建议),那么您可以这样做:

WHERE RFT.FilterType = 'Postcode' AND
      LEN(RFT.Postcode) < 4 AND
      (RFT.PostCode LIKE '%[0-9]' AND RFT.PostCode NOT LIKE '%[0-9][0-9]')

或者,如果你知道至少有两个字符,你可以使用:

WHERE RFT.FilterType = 'Postcode' AND
      LEN(RFT.Postcode) < 4 AND
      RFT.PostCode LIKE '%[^0-9][0-9]' 

答案 1 :(得分:1)

您可以过滤一两个字母(并省略长度检查,因为它隐含在LIKE中):

WHERE RFT.FilterType = 'Postcode' AND
      (RFT.PostCode LIKE '[A-Z][0-9]' OR RFT.PostCode LIKE '[A-Z][A-Z][0-9]')

答案 2 :(得分:0)

非数字后跟1位... LIKE '%[^0-9][0-9]'