varchar가 숫자인지 확인 (TSQL)
varchar가 숫자인지 알아내는 쉬운 방법이 있습니까?
예 :
abc123-> 숫자 없음
123-> 예, 숫자입니다.
감사 :)
기사의 참고 섹션도 확인하십시오.
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
'IT TIP' 카테고리의 다른 글
Android API v2 용 Google지도에 내 위치를 표시하는 방법 (0) | 2020.12.27 |
---|---|
'System.Web.Security.SqlMembershipProvider'에는 스키마 버전 '1'과 호환되는 데이터베이스 스키마가 필요합니다. (0) | 2020.12.27 |
for-in 문 (0) | 2020.12.27 |
sprintf를 사용하여 문자열을 추가하는 방법은 무엇입니까? (0) | 2020.12.27 |
Java BitSet 예 (0) | 2020.12.27 |