繁体   English   中英

删除前导零

[英]Remove leading zeros

给定列中的数据如下所示:

00001 00
00026 00

我需要使用SQL来删除空格后面的任何内容以及值中的所有前导零,以便最终输出为:

1
26

我该怎么做才能做到最好?

顺便说一下,我正在使用DB2

这是在DB2 for Linux / Unix / Windows和z / OS上测试的。

您可以使用DB2中的LOCATE()函数来查找字符串中第一个空格的字符位置,然后将其作为结束位置(减1)发送到SUBSTR() )以仅获取字符串的第一个数字。 转换为INT将删除前导零,但如果您需要以字符串形式,则可以再次CASTCHAR

SELECT CAST(SUBSTR(col, 1, LOCATE(' ', col) - 1) AS INT)
FROM tab

在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()删除前导和尾随零字符,而外部修剪删除空格。

这在AS400 DB2上对我有用。 “L”代表领导。 您也可以使用“T”进行追踪。

在此输入图像描述

我假设字段类型当前是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM