我有一个名为zip的字段,类型为char(5),其中包含
等邮政编码12345
54321
ABCDE
如果邮政编码只包含数字,我想查看sql语句。
以下内容尚未完成
SELECT * FROM S1234.PERSON
WHERE ZIP NOT LIKE '%'
它无法正常工作,因为即使是' 12345'是一个"阵列"字符(它是'%',对吧?
我发现以下情况正在发挥作用:
SELECT * FROM S1234.PERSON
WHERE ZIP NOT LIKE ' %'
%之前有一个空格。为什么这有效?
答案 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+'