T-sql - 값이 정수인지 확인합니다.
(예:TryParse
.NET)에 저장합니다.유감스럽게도ISNUMERIC
모든 종류의 숫자가 아닌 정수만 구문 분석하고 싶기 때문에 적합하지 않습니다.같은 것이 있습니까?ISINT
아니면 뭔가?
여기 명확하게 하기 위한 몇 가지 코드가 있습니다. 만약에.MY_FIELD
가 아니며,이실패할 것입니다. int가 아닌경이코실패는합다니드우▁is다실패니:▁fail▁wouldint합▁code가▁this.
SELECT @MY_VAR = CAST(MY_FIELD AS INT)
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER'
감사해요.
다음은 다음과 같은 블로그 게시물입니다.IsInteger
UDF.
기본적으로 추가할 것을 권장합니다.'.e0'
가와용맞게에도를 사용합니다.IsNumeric
이런 식으로, 이미 소수점을 가지고 있던 모든 것은 이제 두 개의 소수점을 가지고 있습니다.IsNumeric
거짓이고, 이미 과학적 표기법으로 표현된 모든 것은 무효화됩니다.e0
.
이 문자열을 정수로 변환할 수 있습니까?라는 기사에서 Itzik Ben-Gan은 순수 T-SQL 및 CLR을 사용하는 다른 솔루션을 제공합니다.
어떤 솔루션을 선택해야 합니까?
T-SQL 또는 CLR 솔루션이 더 나은가요?T-SQL 솔루션을 사용하면 T-SQL 프로그래밍의 도메인 밖으로 나갈 필요가 없다는 장점이 있습니다.그러나 CLR 솔루션에는 다음과 같은 두 가지 중요한 이점이 있습니다.더 간단하고 빠릅니다.행 수가 1,000,000개인 테이블을 대상으로 두 솔루션을 모두 테스트한 결과 CLR 솔루션이 노트북에서 실행되는 데 7초가 아니라 2초가 걸렸습니다.그래서 다음에 주어진 문자열을 정수로 변환할 수 있는지 확인해야 할 때, 제가 이 기사에서 제공한 T-SQL 또는 CLR 솔루션을 포함할 수 있습니다.
T-SQL만 유지 관리하려면 순수 T-SQL 솔루션을 사용합니다.편의성보다 성능이 더 중요한 경우 CLR 솔루션을 사용합니다.
순수한 T-SQL 솔루션은 까다롭습니다.내장된 ISUMERIC 기능과 패턴 매칭 및 캐스팅을 결합하여 문자열이 int를 나타내는지 확인합니다.
SELECT keycol, string, ISNUMERIC(string) AS is_numeric,
CASE
WHEN ISNUMERIC(string) = 0 THEN 0
WHEN string LIKE '%[^-+ 0-9]%' THEN 0
WHEN CAST(string AS NUMERIC(38, 0))
NOT BETWEEN -2147483648. AND 2147483647. THEN 0
ELSE 1
END AS is_int
FROM dbo.T1;
CLR 솔루션의 T-SQL 부분은 더 단순합니다.ISNUMERIC을 호출하는 것과 마찬가지로 fn_IsInt 함수를 호출합니다.
SELECT keycol, string, ISNUMERIC(string) AS is_numeric,
dbo.fn_IsInt(string) AS is_int
FROM dbo.T1;
C# 부분은 단순히 의 포장지입니다.NET의 구문 분석 기능 Int32.파스를 써보세요.이 작업은 SQL Server int 및 에서 수행되므로 수행됩니다.NET Int32는 모두 32비트 부호 정수입니다.
using System;
using System.Data.SqlTypes;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBoolean fn_IsInt(SqlString s)
{
if (s.IsNull)
return SqlBoolean.False;
else
{
Int32 i = 0;
return Int32.TryParse(s.Value, out i);
}
}
};
이 코드 샘플에 대한 자세한 설명은 Itzik의 기사를 참조하십시오.
sqlserver 2005 이상에서는 정규식과 유사한 문자 클래스를 LIKE 연산자와 함께 사용할 수 있습니다.여기 보세요.
문자열이 음수가 아닌 정수(십진수 순서)인지 확인하려면 문자열에 다른 문자가 포함되어 있지 않은지 테스트할 수 있습니다.
SELECT numstr
FROM table
WHERE numstr NOT LIKE '%[^0-9]%'
참고 1: 빈 문자열도 반환됩니다.
참고 2: 사용 사용LIKE '%[0-9]%'
숫자 이상이 포함된 문자열을 반환합니다.
피들 참조
WHERE IsNumeric(MY_FIELD) = 1 AND CAST(MY_FIELD as VARCHAR(5)) NOT LIKE '%.%'
그것이 아마도 가장 간단한 해결책일 것입니다.당신의 것이 아니라면요.MY_FIELD
것을 하고 있습니다.00이나 그런 종류의 것을 포함하고 있습니다.하여 float을
네크로맨싱.
SQL-Server 2012+ 이후에는 TRY_CAST를 사용할 수 있습니다. TRY_CAST는 캐스트가 성공하지 못한 경우 NULL을 반환합니다.
예:
DECLARE @foo varchar(200)
SET @foo = '0123'
-- SET @foo = '-0123'
-- SET @foo = '+0123'
-- SET @foo = '+-0123'
-- SET @foo = '+-0123'
-- SET @foo = '.123'
-- SET @foo = '1.23'
-- SET @foo = '.'
-- SET @foo = '..'
-- SET @foo = '0123e10'
SELECT CASE WHEN TRY_CAST(@foo AS integer) IS NULL AND @foo IS NOT NULL THEN 0 ELSE 1 END AS isInteger
이것이 정말 믿을 수 있는 유일한 방법입니다.
SQL-Server 2008에 대한 지원이 필요한 경우 Sam DeHan의 답변을 참조하십시오.
SELECT CASE WHEN ISNUMERIC(@foo + '.e0') = 1 THEN 1 ELSE 0 END AS isInteger
SQL-Server < 2012(2008R2)는 2019-07-09년까지 (확장) 지원을 종료할 예정입니다.
이 시점에서, 곧, < 2012>에 대한 지원이 중단될 수 있습니다.
이 시점에서 저는 더 이상 다른 해킹을 사용하지 않을 것입니다.
에게 업데이트를 2008년 이 넘었습니다. 2008년 10월호입니다.
아래 쿼리가 도움이 되는지 확인합니다.
SELECT *
FROM MY_TABLE
WHERE CHARINDEX('.',MY_FIELD) = 0 AND CHARINDEX(',',MY_FIELD) = 0
AND ISNUMERIC(MY_FIELD) = 1 AND CONVERT(FLOAT,MY_FIELD) / 2147483647 <= 1
은 다은다같다니습과에 대한 입니다.WHERE
를 절로 것; 함가그감록만싸드것는도것을수;▁clause것드만는▁make▁a▁wrap▁to.CASE WHEN
.
ISNUMERIC(table.field) > 0 AND PATINDEX('%[^0123456789]%', table.field) = 0
의 TryParse 대신 SQL인 TRY_CONVERT를 사용합니다.NET. IsNumeric()은 빈 문자열이 (정수) 0으로 계산되고, 일부 완벽하게 유효한 화폐 기호는 그 자체로 (화폐) 0으로 변환되지 않는다는 것을 인식하지 못합니다. 참조
SELECT @MY_VAR = CASE WHEN TRY_CONVERT(INT,MY_FIELD) IS NOT NULL THEN MY_FIELD
ELSE 0
END
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER'
IsNumeric 기능을 사용한 이 해결 방법은 다음과 같습니다.
select * from A where ISNUMERIC(x) =1 and X not like '%.%'
또는 사용
select * from A where x **not like** '%[^0-9]%'
@i 숫자(28,5) = 12.0001로 선언 if (@i/cast(@i asint) > 1)시작한다.'이것은 int가 아닙니다'를 선택합니다.끝.또 다른시작한다.'this is int'를 선택합니다.끝.
2012 Server 2012TRY_CONVERT
그리고.TRY_CAST
기능이 구현되었습니다.이는 다음과 비교하여 크게 개선되었습니다.ISNUMERIC
잘못된 긍정(또는 부정)을 제공할 수 있는 솔루션입니다.예를 들어 다음을 실행하는 경우:
SELECT CONVERT(int,V.S)
FROM (VALUES('1'),
('900'),
('hello'),
('12b'),
('1.1'),
('')) V(S)
WHERE ISNUMERIC(V.S) = 1;
용사를 합니다.TRY_CONVERT
(또는)TRY_CAST
) 이를 방지합니다.
SELECT TRY_CONVERT(int,V.S),
V.S,
ISNUMERIC(V.S)
FROM (VALUES('1'),
('900'),
('hello'),
('12b'),
('1.1'),
('')) V(S)
--WHERE TRY_CONVERT(int,V.S) IS NOT NULL; --To filter to only convertable values
:'1.1'
된 환된반NULL
재작성은 (으)ㄹ 수 없기 에).int
) 뿐만 아니라 그것도''
된 환된반0
,그럼에도 불구하고.ISNUMERIC
값을 "변환할 수 없음"으로 나타냅니다.
저는 당신의 데이터베이스 설계에 문제가 있다고 생각합니다.한 칸에 바르샤르와 숫자를 섞는 것은 정말 나쁜 생각이라고 생각합니다.그것의 이유는 무엇인가?
물론 [0-9] 이외에 문자가 있는지 확인할 수 있지만, 테이블에 1m 행이 있고 모든 행을 확인하고 있다고 가정해 보십시오.잘 안 될 것 같아요.
어쨌든 당신이 정말로 그것을 하고 싶다면, 나는 그것을 고객 쪽에서 하는 것을 제안합니다.
이런 식으로 하는 것이 사탄의 소행이라는 느낌이 듭니다. 하지만 대안으로:
트라이 - 캐치는 어때요?
DECLARE @Converted as INT
DECLARE @IsNumeric BIT
BEGIN TRY
SET @Converted = cast(@ValueToCheck as int)
SET @IsNumeric=1
END TRY
BEGIN CATCH
SET @IsNumeric=0
END CATCH
select IIF(@IsNumeric=1,'Integer','Not integer') as IsInteger
SQL Server 2008 이상에서만 작동합니다.
나는 이 대본을 써보고 답을 얻었습니다.
ISNUMERIC(Replace(Replace([enter_your_number],'+','A'),'-','A') + '.0e0')
예를 들어, 업 질문의 경우 다음과 같은 대답이 있습니다.
SELECT @MY_VAR = CAST(MY_FIELD AS INT)
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER' and ISNUMERIC(Replace(Replace(MY_FIELD,'+','A'),'-','A') + '.0e0') = 1
다음과 같은 작업을 수행하는 것이 어떻습니까?
CASE
WHEN ROUND(MY_FIELD,0)=MY_FIELD THEN CAST(MY_FIELD AS INT)
ELSE MY_FIELD
END
as MY_FIELD2
때로는 데이터베이스를 설계하지 못하고 주어진 작업만 수행하면 됩니다.제 경우에는 2008년 이후로 읽기 권한만 가진 컴퓨터에 위치한 데이터베이스입니다.
나는 잘못 설계된 데이터베이스의 열에서 선택해야 합니다.varchar
숫자가 1-100이지만 때때로 임의의 문자열로 표시됩니다.(데이터베이스 전체를 재설계할 수 있었으면 좋았을 텐데) 저는 이 문제를 해결하기 위해 다음을 사용했습니다.
SELECT A from TABLE where isnumeric(A)=1
나는 SQL의 Pro가 아니지만 1로 구분이 가능한지 확인하는 것은 어떻습니까? 나에게는 그것이 그 일을 합니다.
SELECT *
FROM table
WHERE fieldname % 1 = 0
PATINDEX 사용
DECLARE @input VARCHAR(10)='102030.40'
SELECT PATINDEX('%[^0-9]%',RTRIM(LTRIM(@input))) AS IsNumber
참조 http://www.intellectsql.com/post-how-to-check-if-the-input-is-numeric/
같은 질문을 했습니다.드디어 사용했습니다.
where ATTRIBUTE != round(ATTRIBUTE)
그리고 그것은 나에게 효과가 있었습니다.
WHERE IsNumeric(value + 'e0') = 1 AND CONVERT(FLOAT, value) BETWEEN -2147483648 AND 2147483647
이것은 꽤 오래되었지만 제 솔루션은 여기에 없기 때문에, 저는 이를 위한 다른 가능한 방법을 추가하려고 생각했습니다.
--This query only returns values with decimals
SELECT ActualCost
FROM TransactionHistory
where cast(ActualCost as int) != ActualCost
--This query only returns values without decimals
SELECT ActualCost
FROM TransactionHistory
where cast(ActualCost as int) = ActualCost
여기서 쉬운 부분은 정수로 캐스팅할 때 선택한 값이 동일한지 확인하는 것입니다.
우리는 그것이 정수가 아닌지 확인할 수 있습니다.
SELECT number2 FROM table WHERE number2 LIKE '%[^0-9]%' and (( right(number2 ,len(number2)-1) LIKE '%[^0-9]%' and lefT(number2 ,1) <> '-') or ( right(number2 ,len(number2)-1) LIKE '%[^0-9]%' and lefT(number2 ,1) in ( '-','+') ) )
DECLARE @zip_code NCHAR(10)
SET @zip_code = '1239'
IF TRY_PARSE( @zip_code AS INT) / TRY_PARSE( @zip_code AS INT) = 1 PRINT 'integer'
ELSE PRINT 'not integer'
SQL Server에서 잘 작동합니다.
선택(ISNUMERIC(2)=1 및 2가 '%와 같지 않은 경우 선택)%')
Case
When (LNSEQNBR / 16384)%1 = 0 then 1 else 0 end
언급URL : https://stackoverflow.com/questions/10517777/t-sql-determine-if-value-is-integer
'programing' 카테고리의 다른 글
AWS S3: POST 또는 PUT 요청을 사용하여 파일을 업로드해야 합니까? (0) | 2023.08.23 |
---|---|
겨울잠을 자다, jpa.slot.BasicPathUsageException: 기본 유형의 특성에 가입할 수 없습니다. (0) | 2023.08.23 |
jQuery 'click', 'bind', 'live', 'delegate', 'trigger', 'on' 기능(예시)의 차이는 무엇입니까? (0) | 2023.08.23 |
도커가 포트를 호스트에만 노출 (0) | 2023.08.23 |
Android 에뮬레이터의 실행 속도 향상 (0) | 2023.08.23 |