删除前导零

时间:2012-02-01 05:39:27

标签: sql db2

给出如下列中的数据:

00001 00
00026 00

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

1
26

我怎样才能做到最好?

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

7 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

我假设字段类型目前为VARCHAR,您是否需要存储除INT之外的其他内容?

如果字段类型为INT,则会自动将其删除。

或者,选择值:

SELECT (CAST(CAST Col1 AS int) AS varchar) AS Col1

答案 3 :(得分:1)

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

enter image description here

答案 4 :(得分:0)

一种选择是隐式投射:SELECT SUBSTR(column, 1, 5) + 0 AS column_as_number ...

假设结构是 nnnnn nn ,即恰好5个字符,一个空格和两个以上的字符。

显式转换,即SUBSTR(列,1,5):: INT也是可能的,但确切的语法取决于所讨论的RDBMS。

答案 5 :(得分:0)

当空间位置可变时,或者即使它已修复并且您想要进行更健壮的查询(如果它稍后移动),请使用以下内容来实现此目的:

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形式的情况如果字符串为nn nn,则转换为int将失败。

如果您使用TRIM函数删除前导零,请务必小心,实际上在所有情况下,您都需要使用00120 00等数据测试代码并查看它是否返回{{ 1}}而不是12的正确值。

答案 6 :(得分:0)

我出于某种原因找到了这个线程,并且感到奇怪的是,没有人真正回答这个问题。看来目标是返回左调整字段:

SELECT 
       TRIM(L '0' FROM SUBSTR(trim(col) || ' ',1,LOCATE(' ',trim(col) || ' ') - 1))
  FROM tab