문자 타입 컬럼 중 숫자가 아닌 값 찾는 건가요?
문자 함수만으로는 모든 경우를 만족하는 완벽한 구문을 만들기는 어렵습니다.
어떤 유형의 값들이 있는지 확인하여 그 케이스에 맞는 구문을 만들어야 합니다.
완벽하진 않아도 현재 존재하는 경우들에 한하여서는 동작이 가능한 조건을 만들 수는 있습니다.
정규식이나, translate 도 그 중 한 방법이구요.
정상 수행되는 쿼리가 Mybatis 에서만 오류가 난다면? CDATA 를 사용하시면 됩니다.
<![CDATA[
-- 쿼리문 --
]]>
완벽하게 숫자인지 체크하려면 변환해 봐야지만 알 수 있는데.
숫자 체크용 함수를 만들어 사용하면 완벽하게 체크가 가능하구요.
- 함수 내부에서 실제로 TO_NUMBER 수행하여 오류인지 체크
XML 구문에서 형변환 가능여부를 체크하는 방법도 있습니다.
WITH t AS ( SELECT '12.34' v FROM dual UNION ALL SELECT '+1234' FROM dual UNION ALL SELECT '-34.0' FROM dual UNION ALL SELECT '100E2' FROM dual UNION ALL SELECT '12ABC' FROM dual UNION ALL SELECT '12-34' FROM dual UNION ALL SELECT '34+56' FROM dual UNION ALL SELECT '++346' FROM dual ) SELECT * FROM t , XMLTABLE('if (. castable as xs:decimal) then 1 else 0' PASSING v COLUMNS x NUMBER PATH '.') WHERE x = 1 -- 정상 -- WHERE x = 0 -- 오류 ;
감사합니다. 마농님..
CDATA 로 묶어나 안묵으나 오류는 나지 않습니다. 근대 파라미터가 밀려서 로그에 나와서
'^[+-]?\d*(\.?\d*)$' 쓰기가 좀 그렇습니다. 결과는 맞는거 같은대 말이죠.
이런식으로 처리하면 될거같습니다. 감사합니다.
SELECT CASE WHEN (
SELECT X FROM
(
SELECT '12.341' V FROM dual
) T
, XMLTABLE('if (. castable as xs:decimal) then 1 else 0' PASSING v COLUMNS x NUMBER PATH '.') aa
WHERE X = 1
) = 1 THEN 'Y' ELSE 'N' END AS TT
FROM DUAL;