给出如下列中的数据:
00001 00
00026 00
我需要使用SQL删除空格后面的任何内容以及值中的所有前导零,以便最终输出为:
1
26
我怎样才能做到最好?
顺便说一句,我正在使用DB2
答案 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)
答案 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