确定是否邮政编码只包含数字(Determine if zip code contains numbe

2019-09-27 06:03发布

我有一个名为zip字段,类型char(5),其中包含像邮政编码

12345
54321
ABCDE

我想要一个SQL语句来检查,如果邮政编码仅包含数字。

以下是不工作

SELECT * FROM S1234.PERSON
WHERE ZIP NOT LIKE '%'

它不能正常工作,因为即使“12345”是一个字符的“阵列”(这是“%”,对吧?

我发现了以下工作:

SELECT * FROM S1234.PERSON
WHERE ZIP NOT LIKE ' %'

它之前%的空间。 这是为什么工作?

Answer 1:

如果你使用SQL Server 2012或向上下面的脚本应该工作。

DECLARE @t TABLE (Zip VARCHAR(10))

INSERT INTO @t VALUES ('12345')
INSERT INTO @t VALUES ('54321')
INSERT INTO @t VALUES ('ABCDE')


SELECT *
FROM   @t AS t
WHERE  TRY_CAST(Zip AS NUMERIC) IS NOT NULL


Answer 2:

从使用的答案在这里,检查所有的数字

SELECT col1,col2
FROM
   (
     SELECT col1,col2,
                 CASE
                     WHEN LENGTH(RTRIM(TRANSLATE(ZIP , '*', ' 0123456789'))) = 0 
                     THEN 0 ELSE 1
                 END as IsAllDigit
     FROM S1234.PERSON
   ) AS Z
WHERE IsAllDigit=0

DB2多年平均值有一个像MySQL的正则表达式设施REGEXP



Answer 3:

USE ISNUMERIC功能; 如果参数中只包含数字和零,如果它不ISUMERIC返回1

实施例:SELECT * FROM S1234.PERSON WHERE ISNUMERIC(ZIP)= 1

您的声明并不针对验证电话号码,但它说获得不带空格开始的一切。



Answer 4:

让我们假设你ZIP码是美国邮政编码,由5个号码组成。

db2 "with val as (
 select *
 from S1234.PERSON t
 where xmlcast(xmlquery('fn:matches(\$ZIP,''^\d{5}$'')') as integer) = 1
)
select * from val"

有关XQuery的更多信息:FN:匹配: http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.xml.doc/doc/xqrfnmat.html



Answer 5:

MySQL没有本地isNumberic()函数。 这将是非常直接的Excel中与ISNUMBER()函数,或在T-SQL中使用ISNUMERIC(),但在MySQL没有工作了那么一点点的搜索后,我身边穿过这个解决方案来...

SELECT * FROM S1234.PERSON 
WHERE ZIP REGEXP ('[0-9]')

我们实际上正在处理的“ZIP”字段的内容的正则表达式,它可能看起来像使用大锤牛刀,我已经不知道如何表现会从一个更简单的方法有所不同,但它的工作,我猜这才是重点。



Answer 6:

我已经基于该解决方案更容易出错版本https://stackoverflow.com/a/36211270/565525 ,增加中间结果,一些例子:

select 
      test_str
    ,                  TRIM(TRANSLATE(replace(trim(test_str), ' ', 'x'), 'yyyyyyyyyyy', '0123456789'))
    , case when length(TRIM(TRANSLATE(replace(trim(test_str), ' ', 'x'), 'yyyyyyyyyyy', '0123456789')))=5 then '5-digit-zip'  else 'not 5d-zip' end is_zip
from (VALUES 
        ('  123  '  )
        ,('  abc  ' )
        ,('  a12  ' )
        ,('  12 3  ')
        ,('  99435 ')
        ,('99323'   )
    ) AS X(test_str)
;

在这个例子中设置的结果是:

TEST_STR 2        IS_ZIP
-------- -------- -----------
  123    yyy      not 5d-zip
  abc    abc      not 5d-zip
  a12    ayy      not 5d-zip
  12 3   yyxy     not 5d-zip
  99435  yyyyy    5-digit-zip
99323    yyyyy    5-digit-zip


Answer 7:

请检查是否有小写和大写之间的差异。 数字和特殊字符看起来是一样的:

SELECT *
FROM S1234.PERSON 
WHERE UPPER(ZIP COLLATE Latin1_General_CS_AI ) = LOWER(ZIP COLLATE Latin1_General_CS_AI)


Answer 8:

这里有一个地方你要检查的邮政编码的范围的情况下工作的例子。 您可以使用此代码为灵感做一个简单的单篇文章的代码检查,如果你想:

if local_test_environment?
  # SQLite supports GLOB which is similar to LIKE (which it only has limited support for), for matching in strings.
  where("(zip_code NOT GLOB '*[^0-9]*' AND zip_code <> '') AND (CAST(zip_code AS int) >= :range_start AND CAST(zip_code AS int) <= :range_finish)", range_start: range_start, range_finish: range_finish)
else
  # SQLServer supports LIKE with more advanced matching in strings than what SQLite supports.
  # SQLServer supports TRY_PARSE which is non-standard SQL, but fixes the error SQLServer gives with CAST, namely: Conversion failed when converting the nvarchar value 'US-19803' to data type int.
  where("(zip_code NOT LIKE '%[^0-9]%' AND zip_code <> '') AND (TRY_PARSE(zip_code AS int) >= :range_start AND TRY_PARSE(zip_code AS int) <= :range_finish)", range_start: range_start, range_finish: range_finish)
end


Answer 9:

使用正则表达式。

SELECT * FROM S1234.PERSON
WHERE ZIP REGEXP '\d+'


文章来源: Determine if zip code contains numbers only
标签: sql db2