我有一个名为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