programing

오른쪽에서 줄을 잡다

muds 2023. 6. 30. 22:40
반응형

오른쪽에서 줄을 잡다

저는 오라클에 문의 사항을 작성하고 있습니다.

저는 오른쪽에서 줄을 받고 싶은데 줄 길이가 동적입니다.

예:

299123456789

123456789를 받고 싶습니다.

substr(PHONE_NUMBERS,-X,Y)

X는 각 레코드마다 다릅니다.

시도해 봤습니다.

substr(PHONE_NUMBERS,-length(PHONE_NUMBERS),Y)

그리고 그것은 작동하지 않았습니다.

이 쿼리를 어떻게 작성할 수 있습니까?

마지막 3개의 문자를 나열하려면 가장 간단한 방법입니다.

 select substr('123456',-3) from dual;
SQL> select substr('123456',-1,6) from dual;

S
-
6

SQL> select substr('123456',-6,6) from dual;

SUBSTR
------
123456

SQL> select substr('123456',-7,6) from dual;

S
-

위의 문장을 보면 3 쿼리는 null 값을 -7 > length('123456')로 제공합니다.

길이를 확인합니다.CONT_PHONE_NUMBERS그리고.PHONE_NUMBERS

이것이 당신에게 도움이 되길 바랍니다.

SQL> select substr('999123456789', greatest (-9, -length('999123456789')), 9) as value from dual;

VALUE
---------
123456789

SQL> select substr('12345', greatest (-9,  -length('12345')), 9) as value from dual;

VALUE
----
12345

호출:greatest (-9, -length(string))시작 오프셋을 문자열의 끝 또는 시작의 왼쪽 9자로 제한합니다.

나는 방금 그것을 알았습니다.regexp_substr()이 목적에 완벽합니다 :)

저의 과제는 이론적으로 7~250자 길이의 모든 것이 될 수 있는 참조 문자열에서 오른쪽 16자를 선택하는 것입니다.그것은 나를 짜증나게 합니다.substr( OurReference , -16 )돌아온다null언제length( OurReference ) < 16(한편, Oracle이 결과적으로 반환하는 것도 논리적입니다.null방문할 때마다substr()문자열의 경계를 초과합니다.)그러나 문자열이 끝나기 직전에 1에서 16 사이의 모든 문자를 인식하도록 정규식을 설정할 수 있습니다.

regexp_substr( OurReference , '.{1,16}$' )

정규 표현과 관련된 성능 문제에 대해서는 다음 중 어느 것을 말할 수 없습니다.GREATER()솔루션과 이 솔루션이 가장 적합합니다.이거 시험해 본 사람?일반적으로 정규 표현은 깔끔하고 잘 쓰면 상당히 빠르다는 것을 경험했습니다.

행운을 빌어요! :)

substr(PHONE_NUMBERS, length(PHONE_NUMBERS) - 3, 4)

패턴은 다음과 같이 보일 수 있습니다.

substr(STRING, ( length(STRING) - (TOTAL_GET_LENGTH - 1) ),TOTAL_GET_LENGTH)

당신의 경우, 이것은 다음과 같을 것입니다.

substr('299123456789', (length('299123456789')-(9 - 1)),9)

substr('299123456789', (12-8),9)

substr('299123456789', 4,9)

the result ? of course '123456789'

길이는 역동적입니다, voila :)

SELECT SUBSTR('299123456789',DECODE(least(LENGTH('299123456789'),9),9,-9,LENGTH('299123456789')*-1)) value from dual  

123456789를 제공합니다.

숫자가 9자리 미만인 경우에도 동일한 문이 작동합니다.

SELECT SUBSTR('6789',DECODE(least(LENGTH('6789'),9),9,-9,LENGTH('6789')*-1)) value from dual  

6789 제공

저도 같은 문제가 있었습니다.이것은 저에게 효과가 있었습니다.

 CASE WHEN length(sp.tele_phone_number) = 10 THEN
                   SUBSTR(sp.tele_phone_number,4)

아래 솔루션은 이러한 목적에 적합합니다.

select mod('299123456789',1000000000) from dual;

가장 간단한 솔루션:

substr('299123456',-6,6)

언급URL : https://stackoverflow.com/questions/3440849/get-string-from-right-hand-side

반응형