确定邮政编码是否仅包含数字

时间:2014-05-06 08:34:52

标签: sql db2

我有一个名为zip的字段,类型为char(5),其中包含

等邮政编码
12345
54321
ABCDE

如果邮政编码只包含数字,我想查看sql语句。

以下内容尚未完成

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

它无法正常工作,因为即使是' 12345'是一个"阵列"字符(它是'%',对吧?

我发现以下情况正在发挥作用:

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

%之前有一个空格。为什么这有效?

9 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用here to check if all are digit的答案

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

答案 2 :(得分:0)

使用ISNUMERIC功能; 如果参数仅包含数字,则ISUMERIC返回1,如果不包含数字,则返回零

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

您的陈述并未对数字进行验证,但它表示获取的所有内容都不会以空格开头。

答案 3 :(得分:0)

假设您的邮政编码是美国邮政编码,由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:matches:http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.xml.doc/doc/xqrfnmat.html

答案 4 :(得分:0)

mySql没有本机isNumberic()函数。这在使用ISNUMBER()函数的Excel中非常简单,或者在带有ISNUMERIC()的T-SQL中非常简单,但是在MySQL中没有工作,所以经过一番搜索我遇到了这个解决方案......

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

有效地,我们正在处理“ZIP'”内容的正则表达式。现在,看起来好像用大锤来破解坚果,我不知道性能如何与更简单的方法有所不同,但它确实有效,我想这就是重点。

答案 5 :(得分:0)

我根据解决方案https://stackoverflow.com/a/36211270/565525制作了更容易出错的版本,添加了intermedia结果,一些例子:

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

答案 6 :(得分:0)

尝试检查小写和大写之间是否存在差异。数字和特殊字符看起来都一样:

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

答案 7 :(得分:0)

以下是您要检查某个范围内的邮政编码的工作示例。如果您愿意,可以使用此代码作为灵感来进行简单的单一邮政编码检查:

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

答案 8 :(得分:-1)

使用正则表达式。

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