programing

varchar SQL 개발자에서 선행 0을 제거하는 중

newsource 2023. 6. 9. 22:05

varchar SQL 개발자에서 선행 0을 제거하는 중

바르샤르 형태의 숫자에서 선행 0을 제거하려면 어떻게 해야 합니까?다음을 시도해 보았습니다.

옵션 1:

insert into example_table (columnName) 
    (SELECT
        SUBSTR(columnName2, InStr('%[^0 ]%', columnName2 + ' '), 10)
        from columnName2);

이것과 함께, 제가 받는 오류는

SQL Error: ORA-01722: invalid number
ORA-02063: preceding line from xxxx
01722. 00000 -  "invalid number"

옵션 2:

insert into example_table (columnName) 
    (SELECT
        SUBSTR(columnName2, InStr('%[^0 ]%', columnName2 + ' '),  
        LEN(columnName2))
     from columnName2);

이번엔...

Error at Command Line:23 Column:87
Error report:
SQL Error: ORA-00904: "LEN": invalid identifier

옵션 3:

SUBSTRING
    (columnName2, PATINDEX('%[^0 ]%', columnName2 + ' '), 10));

위와 비슷하게, 나는 이해합니다.

Error at Command Line:23 Column:41
Error report:
SQL Error: ORA-00904: "PATINDEX": invalid identifier
00904. 00000 -  "%s: invalid identifier"

편집

트림 경로가 제 최선의 선택일 수도 있다고 생각합니다만...저는 제가 가지고 있는 경우에 그것을 어떻게 사용해야 할지 잘 모르겠습니다.

INSERT INTO temp_table
(columnNeedTrim, column2, column3, column4, column5) 
    SELECT * FROM
        (SELECT(
      SELECT TRIM(leading '0' from columnNeedTrim) FROM table),
            table.column2, 
            table2.column3,
                table.column4
                table.column5
        FROM
        table 
        INNER JOIN 
        table2 ON
            table1.columnNeedTrim=table2.columnNeedTrim) 
    WHERE NOT EXISTS (SELECT * FROM temp_table);

트림 기능이 여러 행 결과를 반환하기 때문에 오류가 발생합니다.

Error report:
SQL Error: ORA-01427: single-row subquery returns more than one row
01427. 00000 -  "single-row subquery returns more than one row"

위의 설명에 트림(또는 깁스)을 어떻게 적용해야 할지 잘 모르겠습니다.도와드릴까요?도와주셔서 감사합니다!

Oracle에 내장되어 있음TRIM문자열에 대한 함수입니다.당신이 다음과 같은 문자열을 가지고 있다고 가정합니다.'00012345'그리고 당신은 그것을 실제로 변환하는 것이 아니라 문자열로 유지하기를 원합니다.NUMBER옵션인 초와 함께 기능을 사용할 수 있습니다.set0을 트리밍 중임을 지정하는 매개 변수:

select ltrim('000012345', '0') from dual;

LTRIM
-----
12345

선행 공간이 있는 경우 한 번에 두 가지를 모두 자를 수 있습니다.

select ltrim(' 00012345', '0 ') from dual;

LTRIM
-----
12345

숫자로 변환한 후 다시 변환할 수도 있지만, 제거하려는 다른 형식이 없는 한 이 작업은 많은 작업으로 보입니다.

select to_char(to_number('000012345')) from dual;

참고로, 첫 번째 시도에서 ORA-01722를 얻는 직접적인 이유는 숫자를 사용하고 있기 때문입니다.+Oracle 문자열 집중 연산자 대신 연산자||그것은 당신이 피하려고 하는 것처럼 보이는 당신의 문자열을 숫자로 암묵적으로 변환하는 것이고, 단일 공간의 암묵적인 변환은 오류를 유발합니다. (아마도 당신의 값 중 일부는, 사실, 숫자가 왜 저장되어야 하는지에 대한 또 다른 예입니다.)NUMBER필드; 만약 그렇다면, 숫자로 변환(또는 캐스팅)한 후에도 ORA-01722를 얻을 수 있을 것입니다.두 번째 시도에서도 같은 결과를 얻을 수 있습니다.LENGTH대신에LEN어쨌든 둘 다 작동하지 않을 것입니다.INSTR정규 표현을 인식하지 못합니다.사용할 수 있습니다.REGEXP_INSTR대신, 하지만 @schurik's가 더 나을 것입니다.REGEXP_REPLACE그 경로를 따라 내려가려면 버전을 선택합니다.


질문 편집 내용을 이해할 수 없습니다.삽입은 다음과 같이 단순화될 수 있습니다.

INSERT INTO temp_table (columnNeedTrim, column2, column3, column4, column5)
SELECT LTRIM(table1.columnNeedTrim, '0 '),
    table1.column2,
    table1.column3,
    table1.column4,
    table1.column5
FROM table1
INNER JOIN table2 ON table2.columnNeedTrim = table1.columnNeedTrim
WHERE NOT EXISTS (
    SELECT * FROM temp_table
    WHERE columnNeedTrim = LTRIM(t42.columnNeedTrim, '0 '));

(사용자 버전에서 하위 쿼리를 수행하는 이유 또는 다른 하위 쿼리에서 잘린 값을 가져오는 이유를 이해할 수 없습니다.)

은 또한 수있다습니도를 사용할 .MERGE:

MERGE INTO temp_table tt
USING (
    SELECT LTRIM(t42.columnNeedTrim, '0 ') AS columnNeedTrim,
        t42.column2,
        t42.column3,
        t42.column4,
        t42.column5
    FROM t42 
    INNER JOIN t43 ON t43.columnNeedTrim=t42.columnNeedTrim
) sr
ON (sr.columnNeedTrim = tt.columnNeedTrim)
WHEN NOT MATCHED THEN
INSERT (tt.columnNeedTrim, tt.column2, tt.column3, tt.column4, tt.column5)
VALUES (sr.columnNeedTrim, sr.column2, sr.column3, sr.column4, sr.column5);
SELECT '00012345' AS zeroWith, TRIM(LEADING 0 FROM '00012345') AS zeroWithOut
  FROM dual;

결과: 0With > 00012345 & zeroWithout > 12345

SQL 서버의 경우 데이터가 실제로 숫자라는 것을 알고 있는 경우 두 번만 캐스트하면 됩니다. an 팅스캐에에 .int선행 0을 제거한 다음 삽입할 문자열로 돌아갑니다.오라클에서도 비슷한 작업을 수행할 수 있을 것으로 생각합니다.

DECLARE @vc varchar(100) = '0000000000000000000001234'

SELECT CAST(CAST(@vc as int) as varchar(100))

반환:

1234

교체할 필요가 없습니다.오라클에서 처리할 것입니다.

SELECT  TO_NUMBER(num)
FROM
(
        SELECT '00000123' AS num FROM DUAL
);

-- Result:
-- 123

다음 방법을 사용할 수 있습니다.

옵션 1: 알렉스가 말한 대로 ltrim 기능을 사용합니다.

select ltrim('0005400', '0')
  from dual;

옵션 2: 트림 기능을 사용합니다.

select trim(leading '0' from '0005400')
  from dual;

Oracle 트림 기능에는 선행, 후행 및 두 가지 옵션이 모두 있습니다.

옵션 3: 정규식 사용:

select regexp_substr('0005400', '[^0].+')
  from dual;

언급URL : https://stackoverflow.com/questions/17656790/removing-leading-zeros-from-varchar-sql-developer