[英]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.