IT TIP

varchar가 숫자인지 확인 (TSQL)

itqueen 2020. 12. 27. 20:34
반응형

varchar가 숫자인지 확인 (TSQL)


varchar가 숫자인지 알아내는 쉬운 방법이 있습니까?

예 :

abc123-> 숫자 없음

123-> 예, 숫자입니다.

감사 :)


ISNUMERIC

기사의 참고 섹션도 확인하십시오.


ISNUMERIC은하지 않습니다. 문자열을 숫자 유형 하나로 변환 할 수 있다는 것을 알려줍니다 . 이는 거의 항상 알아야 할 무의미한 정보입니다. 예를 들어, 다음은 모두 ISNUMERIC에 따라 숫자입니다.

£, $, 0d0

숫자와 숫자 만 확인하려면 음의 LIKE 표현식이 필요합니다.

not Value like '%[^0-9]%'

이렇게 확인할 수 있습니다

declare @vchar varchar(50)
set @vchar ='34343';
select case when @vchar not like '%[^0-9]%' then 'Number' else 'Not a Number' end

SQL Server 2012+를 사용하면 특정 요구 사항이있는 경우 TRY_ * 함수를 사용할 수 있습니다. 예를 들면

-- will fail for decimal values, but allow negative values
TRY_CAST(@value AS INT) IS NOT NULL 

-- will fail for non-positive integers; can be used with other examples below as well, or reversed if only negative desired
TRY_CAST(@value AS INT) > 0

-- will fail if a $ is used, but allow decimals to the specified precision
TRY_CAST(@value AS DECIMAL(10,2)) IS NOT NULL 

-- will allow valid currency
TRY_CAST(@value AS MONEY) IS NOT NULL  

-- will allow scientific notation to be used like 1.7E+3
TRY_CAST(@value AS FLOAT) IS NOT NULL 

십진수 값을 허용해야 할 필요가있어서 not Value like '%[^0-9.]%'


소수에 대한 Wade73의 대답은 제대로 작동하지 않습니다. 소수점 하나만 허용하도록 수정했습니다.

declare @MyTable table(MyVar nvarchar(10));
insert into @MyTable (MyVar) 
values 
    (N'1234')
    , (N'000005')
    , (N'1,000')
    , (N'293.8457')
    , (N'x')
    , (N'+')
    , (N'293.8457.')
    , (N'......');

-- This shows that Wade73's answer allows some non-numeric values to slip through.
select * from (
    select 
        MyVar
        , case when MyVar not like N'%[^0-9.]%' then 1 else 0 end as IsNumber 
    from 
        @MyTable
) t order by IsNumber;

-- Notice the addition of "and MyVar not like N'%.%.%'".
select * from (
    select 
        MyVar
        , case when MyVar not like N'%[^0-9.]%' and MyVar not like N'%.%.%' then 1 else 0 end as IsNumber 
    from 
        @MyTable
) t 
order by IsNumber;

DECLARE @A nvarchar(100) = '12'
IF(ISNUMERIC(@A) = 1)
BEGIN
    PRINT 'YES NUMERIC'
END

Neizan의 코드는 "."의 값만 허용합니다. 을 통하여. 너무 현명해질 위험이 있으므로 AND절을 하나 더 추가했습니다 .

declare @MyTable table(MyVar nvarchar(10));
insert into @MyTable (MyVar) 
values 
    (N'1234')
    , (N'000005')
    , (N'1,000')
    , (N'293.8457')
    , (N'x')
    , (N'+')
    , (N'293.8457.')
    , (N'......')
    , (N'.')
    ;

-- This shows that Neizan's answer allows "." to slip through.
select * from (
    select 
        MyVar
        , case when MyVar not like N'%[^0-9.]%' then 1 else 0 end as IsNumber 
    from 
        @MyTable
) t order by IsNumber;

-- Notice the addition of "and MyVar not like '.'".
select * from (
    select 
        MyVar
        , case when MyVar not like N'%[^0-9.]%' and MyVar not like N'%.%.%' and MyVar not like '.' then 1 else 0 end as IsNumber 
    from 
        @MyTable
) t 
order by IsNumber;

Damien_The_Unbeliever는 자신이 숫자에만 좋다고 언급했습니다.

Wade73은 소수점 처리를 위해 비트를 추가했습니다.

neizan은 어디에도 없었던 추가 조정을했다

불행히도 음수 값을 처리하는 것으로 보이지 않으며 값에 쉼표가있는 것으로 보입니다.

음수 값과 쉼표가있는 값을 선택하는 방법은 다음과 같습니다.

declare @MyTable table(MyVar nvarchar(10));
insert into @MyTable (MyVar) 
values 
(N'1234')
, (N'000005')
, (N'1,000')
, (N'293.8457')
, (N'x')
, (N'+')
, (N'293.8457.')
, (N'......')
, (N'.')
, (N'-375.4')
, (N'-00003')
, (N'-2,000')
, (N'3-3')
, (N'3000-')
;

-- This shows that Neizan's answer allows "." to slip through.
select * from (
select 
    MyVar
    , case when MyVar not like N'%[^0-9.]%' then 1 else 0 end as IsNumber 
from 
    @MyTable
) t order by IsNumber;

-- Notice the addition of "and MyVar not like '.'".
select * from (
select 
    MyVar
    , case when MyVar not like N'%[^0-9.]%' and MyVar not like N'%.%.%' and MyVar not like '.' then 1 else 0 end as IsNumber 
from 
    @MyTable
) t 
order by IsNumber;

--Trying to tweak for negative values and the comma
--Modified when comparison
select * from (
select 
    MyVar
    , case 
        when MyVar not like N'%[^0-9.,-]%' and MyVar not like '.' and isnumeric(MyVar) = 1 then 1
        else 0 
    end as IsNumber 
from 
    @MyTable
) t 
order by IsNumber;

참조 URL : https://stackoverflow.com/questions/4603292/check-if-a-varchar-is-a-number-tsql

반응형