[英]Remove leading zeros
给定列中的数据如下所示:
00001 00
00026 00
我需要使用SQL来删除空格后面的任何内容以及值中的所有前导零,以便最终输出为:
1
26
我该怎么做才能做到最好?
顺便说一下,我正在使用DB2
在DB2(Express-C 9.7.5)中,您可以使用SQL标准TRIM()
函数:
db2 => CREATE TABLE tbl (vc VARCHAR(64))
DB20000I The SQL command completed successfully.
db2 => INSERT INTO tbl (vc) VALUES ('00001 00'), ('00026 00')
DB20000I The SQL command completed successfully.
db2 => SELECT TRIM(TRIM('0' FROM vc)) AS trimmed FROM tbl
TRIMMED
----------------------------------------------------------------
1
26
2 record(s) selected.
内部TRIM()
删除前导和尾随零字符,而外部修剪删除空格。
我假设字段类型当前是VARCHAR
,你需要存储除INT之外的东西吗?
如果字段类型为INT
,则会自动删除它们。
或者,选择值:
SELECT (CAST(CAST Col1 AS int) AS varchar) AS Col1
我出于某种原因找到了这个帖子,发现没有人真正回答这个问题很奇怪。 似乎目标是返回左侧调整后的字段:
SELECT
TRIM(L '0' FROM SUBSTR(trim(col) || ' ',1,LOCATE(' ',trim(col) || ' ') - 1))
FROM tab
一个选项是隐式转换: SELECT SUBSTR(column, 1, 5) + 0 AS column_as_number ...
这假定结构是nnnnn nn ,即恰好5个字符,一个空格和两个以上的字符。
显式转换,即SUBSTR(列,1,5):: INT也是一种可能性,但确切的语法取决于所讨论的RDBMS。
当空间位置可变时,或者即使它已修复并且您想要进行更强大的查询(如果它稍后移动),请使用以下内容来实现此目的:
SELECT CAST(SUBSTR(LTRIM('00123 45'), 1, CASE WHEN LOCATE(' ', LTRIM('00123 45')) <= 1 THEN LEN('00123 45') ELSE LOCATE(' ', LTRIM('00123 45')) - 1 END) AS BIGINT)
如果您知道该列在开始后将始终包含空格:
SELECT CAST(LOCATE(LTRIM('00123 45'), 1, LOCATE(' ', LTRIM('00123 45')) - 1) AS BIGINT)
这两个导致:
123
所以你的查询会
SELECT CAST(SUBSTR(LTRIM(myCol1), 1, CASE WHEN LOCATE(' ', LTRIM(myCol1)) <= 1 THEN LEN(myCol1) ELSE LOCATE(' ', LTRIM(myCol1)) - 1 END) AS BIGINT)
FROM myTable1
这将删除第一个空格字符后面的任何内容(忽略前导空格),然后将余数转换为64位整数,然后删除所有前导零。
如果您想保留所有数字,只需删除前导零和任何可以使用的空格:
SELECT CAST(REPLACE('00123 45', ' ', '') AS BIGINT)
虽然我的答案可能看起来相当简单,只比SELECT CAST(SUBSTR(myCol1, 1, 5) AS BIGINT) FROM myTable1
但它允许空格字符并不总是在那里, myCol1
值不是nnnnn nn
形式的情况nnnnn nn
如果字符串是nn nn
则转换为int
将失败。
如果使用TRIM
函数删除前导零,请务必小心,实际上在所有情况下,您都需要使用00120 00
等数据测试代码,并查看它是否返回12
而不是正确的值120
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.