programing

T-sql - 값이 정수인지 확인합니다.

css3 2023. 8. 23. 21:56

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'

감사해요.

다음은 다음과 같은 블로그 게시물입니다.IsIntegerUDF.

기본적으로 추가할 것을 권장합니다.'.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