Удалить ведущие нули - PullRequest
       1

Удалить ведущие нули

3 голосов
/ 01 февраля 2012

Данные даны в столбце, который выглядит следующим образом:

00001 00
00026 00

Мне нужно использовать SQL, чтобы удалить что-либо после пробела и все начальные нули из значений, чтобы окончательный результат был:

1
26

Как мне лучше всего это сделать?

Кстати, я использую DB2

Ответы [ 7 ]

4 голосов
/ 01 февраля 2012

Это было проверено в DB2 для Linux / Unix / Windows и z / OS.

Вы можете использовать функцию LOCATE() в DB2, чтобы найти позицию символа первого пробелав строке, а затем отправьте это SUBSTR() в качестве конечного местоположения (минус один), чтобы получить только первое число строки.Приведение к INT избавит от ведущих нулей, но если вам нужно это в строковой форме, вы можете снова CAST к CHAR.

SELECT CAST(SUBSTR(col, 1, LOCATE(' ', col) - 1) AS INT)
FROM tab
3 голосов
/ 01 февраля 2012

В 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() удаляет начальные и конечные нулевые символы, а внешняя обрезка удаляет пробелы.

1 голос
/ 13 июля 2017

Это сработало для меня на AS400 DB2.«L» означает «Ведущий».Вы также можете использовать "T" для трейлинга.

enter image description here

1 голос
/ 01 февраля 2012

Я предполагаю, что тип поля в настоящее время VARCHAR, вам нужно хранить вещи, отличные от INT?

Если тип поля был INT, они будут удалены автоматически.

В качестве альтернативы, выберите значения:

SELECT (CAST(CAST Col1 AS int) AS varchar) AS Col1
0 голосов
/ 07 декабря 2018

Я почему-то нашел эту ветку и нахожу странным, что на самом деле никто не ответил на вопрос. Похоже, что цель состоит в том, чтобы вернуть левое скорректированное поле:

SELECT 
       TRIM(L '0' FROM SUBSTR(trim(col) || ' ',1,LOCATE(' ',trim(col) || ' ') - 1))
  FROM tab
0 голосов
/ 01 февраля 2012

Используйте следующее, чтобы добиться этого, когда местоположение в пространстве является переменным или даже когда оно фиксировано, и вы хотите сделать более надежный запрос (в случае, если он перемещается позже):

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, и посмотреть, вернется ли он 12 вместо правильное значение 120.

0 голосов
/ 01 февраля 2012

Один из вариантов - неявное приведение: SELECT SUBSTR(column, 1, 5) + 0 AS column_as_number ...

Предполагается, что структура nnnnn nn , то есть ровно 5 символов, пробел и еще два символа.

Явное приведение, то есть SUBSTR (столбец, 1,5) :: INT также возможно, но точный синтаксис зависит от рассматриваемой СУБД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...