[SQL] 문자열 SQL에서 숫자 있는지 어떻게 확인할 수 있습니까?
SQL문자열 SQL에서 숫자 있는지 어떻게 확인할 수 있습니까?
오라클 10g에서 SQL 쿼리, 나는 문자열이 숫자인지 여부를 확인해야합니다. 이걸 어떻게 할 수 있습니까?
해결법
-
==============================
1.당신은 REGEXP_LIKE을 사용할 수 있습니다 :
당신은 REGEXP_LIKE을 사용할 수 있습니다 :
SELECT 1 FROM DUAL WHERE REGEXP_LIKE('23.9', '^\d+(\.\d+)?$', '')
-
==============================
2.이 시도 할 수 있습니다 :
이 시도 할 수 있습니다 :
SELECT LENGTH(TRIM(TRANSLATE(string1, ' +-.0123456789', ' '))) FROM DUAL
문자열 1이 어디 평가하는지. 숫자 경우는 널 (null)을 반환합니다. 자세한 설명 여기를 봐
-
==============================
3.나는 테스트를위한 10G 인스턴스에 액세스 할 수 있지만, 9i의이 작동하지 않습니다
나는 테스트를위한 10G 인스턴스에 액세스 할 수 있지만, 9i의이 작동하지 않습니다
CREATE OR REPLACE FUNCTION is_numeric (p_val VARCHAR2) RETURN NUMBER IS v_val NUMBER; BEGIN BEGIN IF p_val IS NULL OR TRIM (p_val) = '' THEN RETURN 0; END IF; SELECT TO_NUMBER (p_val) INTO v_val FROM DUAL; RETURN 1; EXCEPTION WHEN OTHERS THEN RETURN 0; END; END; SELECT is_numeric ('333.5') is_numeric FROM DUAL;
난 당신이 널 (null) / 빈 상자가 FALSE로 취급하려는 가정 하였다.
-
==============================
4.http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:7466996200346537833 톰 카이트에 의해 지적 밖으로, 당신이 사용하는 경우 내장 TO_NUMBER A의 사용자 정의 함수, 당신은 일하기 위해 여분의 속임수의 비트를해야 할 수도 있습니다.
http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:7466996200346537833 톰 카이트에 의해 지적 밖으로, 당신이 사용하는 경우 내장 TO_NUMBER A의 사용자 정의 함수, 당신은 일하기 위해 여분의 속임수의 비트를해야 할 수도 있습니다.
FUNCTION is_number(x IN VARCHAR2) RETURN NUMBER IS PROCEDURE check_number (y IN NUMBER) IS BEGIN NULL; END; BEGIN PRAGMA INLINE(check_number, 'No'); check_number(TO_NUMBER(x); RETURN 1; EXCEPTION WHEN INVALID_NUMBER THEN RETURN 0; END is_number;
문제는 최적화 컴파일러가 TO_NUMBER의 결과가 어디서나 사용되지 않음을 인식하고 그것을 멀리 최적화 할 수 있다는 것이다.
톰은 (자신의 예보다는 숫자 날짜에 대해 WAS) 말한다 :
-
==============================
5.다음 함수를 생성하지 않고, 간단한 쿼리의 일부가 될 수있는 수치를 결정하는 방법이다. 하지 첫 번째 문자, 또는 두 번째 소수점 - 공백, +를 차지한다.
다음 함수를 생성하지 않고, 간단한 쿼리의 일부가 될 수있는 수치를 결정하는 방법이다. 하지 첫 번째 문자, 또는 두 번째 소수점 - 공백, +를 차지한다.
var v_test varchar2(20); EXEC :v_test := ' -24.9 '; select (case when trim(:v_test) is null then 'N' ELSE -- only banks, or null (case when instr(trim(:v_test),'+',2,1) > 0 then 'N' ELSE -- + sign not first char (case when instr(trim(:v_test),'-',2,1) > 0 then 'N' ELSE -- - sign not first char (case when instr(trim(:v_test),' ',1,1) > 0 then 'N' ELSE -- internal spaces (case when instr(trim(:v_test),'.',1,2) > 0 then 'N' ELSE -- second decimal point (case when LENGTH(TRIM(TRANSLATE(:v_test, ' +-.0123456789',' '))) is not null then 'N' ELSE -- only valid numeric charcters. 'Y' END)END)END)END)END)END) as is_numeric from dual;
-
==============================
6.나는 해결책 발견
나는 해결책 발견
LENGTH(TRIM(TRANSLATE(string1, ' +-.0123456789', ' '))) is null
공백이 포함 된 수 있습니다 ... 내 목적을 위해 숫자하지 않은 "123 45 6789"를 받아들입니다.
트림의 또 다른 수준 / 보정한다이 번역. 다음은 선행 또는 후행 공백과 연속 숫자를 포함하는 문자열 필드를 감지합니다 TO_NUMBER (트림 (문자열 1)가) 실패하지 않도록
LENGTH(TRIM(TRANSLATE(translate(trim(string1),' ','X'), '0123456789', ' '))) is null
-
==============================
7.정수 위해 당신은 아래를 사용할 수 있습니다. 먼저 공간이 될 수있는 캐릭터와 제 변경 번호로 변경 스페이스 변환. 숫자 만이 존재하는 경우 트림은 널 (null)을 반환합니다.
정수 위해 당신은 아래를 사용할 수 있습니다. 먼저 공간이 될 수있는 캐릭터와 제 변경 번호로 변경 스페이스 변환. 숫자 만이 존재하는 경우 트림은 널 (null)을 반환합니다.
TRIM(TRANSLATE(TRANSLATE(TRIM('1 2 3d 4'), ' ','@'),'0123456789',' ')) is null
from https://stackoverflow.com/questions/5666986/how-can-i-determine-if-a-string-is-numeric-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클 - 업데이트에 가입 - 비 키 보존 테이블을 (0) | 2020.06.14 |
---|---|
[SQL] 동일한 값의 연속 그룹 행 타임 스팬을 이용하여 (0) | 2020.06.14 |
[SQL] 레일의 데이터베이스에 모든 SQL 쿼리 로그 (0) | 2020.06.14 |
[SQL] 오류 : 응용 프로그램 오류에 대한 자세한 내용을 원격으로 볼 것을 (0) | 2020.06.14 |
[SQL] PostgreSQL의 ORDER BY 문제 - 자연 종류 (0) | 2020.06.14 |