복붙노트

[SQL] 문자열이 고유 식별자 인 경우 확인하는 방법?

SQL

문자열이 고유 식별자 인 경우 확인하는 방법?

고유 식별자 (SQL 서버)에 대한 ISDATE 또는 ISNUMERIC에 해당하는이 있습니까? 또는 (C #을) TryParse에이 아무것도 상응하는 무엇입니까?

그렇지 않으면 나는 내 자신의 함수를 작성해야하지만, 나는 확실히 나는 바퀴를 개혁하고 있지 않다 만들고 싶어.

내가 커버에 노력하고있어 시나리오는 다음과 같다 :

SELECT something FROM table WHERE IsUniqueidentifier(column) = 1

해결법

  1. ==============================

    1.SQL 서버 2012의 모든 훨씬 쉽게 TRY_CONVERT (고유 식별자, 표현)이한다

    SQL 서버 2012의 모든 훨씬 쉽게 TRY_CONVERT (고유 식별자, 표현)이한다

    SELECT something
    FROM   your_table
    WHERE  TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
    

    SQL 서버의 이전 버전의 경우, 기존의 답변은 두 SQL 서버 또는 불만없이 고유 식별자에 대한 사실 캐스트 여전히 유효 캐스트 오류가 발생 끝낼 수 있습니다 것입니다 문자열과 일치하지 않을 수 있습니다 의미 몇 점을 놓친다.

    SQL Server는 {에서} 또는이없이 포장 GUID를 받아들입니다.

    또한 그것은 문자열의 마지막에없는 문자를 무시합니다. 두 SELECT CAST (고유 식별자로 '{5D944516-98E6-44C5-849F-9C277833C01B} ssssssssss')와 SELECT CAST (고유 식별자로 '5D944516-98E6-44C5-849F - 9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')는 예를 들어 성공.

    대부분의 기본 데이터 정렬 아래에서 LIKE '[A-ZA-Z0-9]는'예 또는 전자와 같은 문자를 일치 종료됩니다

    결과 행을 주조하는 고유 식별자에 마지막 경우는 캐스트가 행이 WHERE에 의해 필터링되기 전에 발생할 수있는 등의 경우 식에서 캐스트 시도를 넣어하는 것이 중요하다.

    그래서 약간 더 강력한 버전이있을 수 있습니다 (r0d30b0y의 아이디어 @ 차입)

    ;WITH T(C)
         AS (SELECT '5D944516-98E6-44C5-849F-9C277833C01B'
             UNION ALL
             SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}'
             UNION ALL
             SELECT '5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
             UNION ALL
             SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss'
             UNION ALL
             SELECT 'ÀD944516-98E6-44C5-849F-9C277833C01B'
             UNION ALL
             SELECT 'fish')
    SELECT CASE
             WHEN C LIKE expression + '%'
                   OR C LIKE '{' + expression + '}%' THEN CAST(C AS UNIQUEIDENTIFIER)
           END
    FROM   T
           CROSS APPLY (SELECT REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]') COLLATE Latin1_General_BIN) C2(expression)
    WHERE  C LIKE expression + '%'
            OR C LIKE '{' + expression + '}%' 
    
  2. ==============================

    2.하지 광산은 ... 온라인이 발견 내가 공유하고자합니다.

    하지 광산은 ... 온라인이 발견 내가 공유하고자합니다.

    SELECT 1 WHERE @StringToCompare LIKE 
           REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
    
  3. ==============================

    3.

    SELECT something 
      FROM table1 
     WHERE column1 LIKE '[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]';
    

    최신 정보:

    ...하지만 훨씬 @ r0d30b0y에 의해 대답의 접근 방식을 선호한다 :

    SELECT something 
      FROM table1 
     WHERE column1 LIKE REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
    
  4. ==============================

    4.난 당신이 "상자 밖으로"를 사용할 수 있다는 것을 인식하지 오전 - 당신이 당신 자신이 작성해야, 난 두려워.

    난 당신이 "상자 밖으로"를 사용할 수 있다는 것을 인식하지 오전 - 당신이 당신 자신이 작성해야, 난 두려워.

    당신이 할 수있는 경우 : - 확실히 훨씬 쉽게 T-SQL에서 무엇보다 사용하는 것입니다있는) 다음 Guid.TryParse (같은 것들을 사용할 수있는 C #을 라이브러리 내부에이를 작성하고 어셈블리 SQL-CLR로 SQL Server에 배포하려고합니다. ...

  5. ==============================

    5.마찬가지로 것은 그것을 간단하게 유지합니다. GUID는 사 가지고 - 그 안에도 단지 문자열 인 경우

    마찬가지로 것은 그것을 간단하게 유지합니다. GUID는 사 가지고 - 그 안에도 단지 문자열 인 경우

    WHERE 열처럼 '% - % - % - % - %'

  6. ==============================

    6.r0d30b0y 응답의 변형은 문자열 내에서 찾을 PATINDEX를 사용하는 것입니다 ...

    r0d30b0y 응답의 변형은 문자열 내에서 찾을 PATINDEX를 사용하는 것입니다 ...

    PATINDEX('%'+REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]')+'%',@StringToCompare) > 0
    

    URL 문자열에서 GUID를 찾기 위해 사용했다 ..

    HTH

    데이브

  7. ==============================

    7.이것은 일부 이전 의견의 개념을 기반으로하는 기능입니다. 이 기능은 매우 빠릅니다.

    이것은 일부 이전 의견의 개념을 기반으로하는 기능입니다. 이 기능은 매우 빠릅니다.

    CREATE FUNCTION [dbo].[IsGuid] (@input varchar(50))  
        RETURNS bit AS  
    BEGIN
    
    RETURN 
        case when @input like '[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]'
        then 1 else 0 end
    END
    GO
    
    /* 
    Usage: 
    
    select [dbo].[IsGuid]('123') -- Returns 0
    select [dbo].[IsGuid]('ebd8aebd-7ea3-439d-a7bc-e009dee0eae0') -- Returns 1
    
    select * from SomeTable where dbo.IsGuid(TableField) = 0 -- Returns table with all non convertable items!
    
    */
    
  8. ==============================

    8.이전 포스트하지만, 단지 빠른 시험을 위해 생각 ...

    이전 포스트하지만, 단지 빠른 시험을 위해 생각 ...

    SELECT  [A].[INPUT],
            CAST([A].[INPUT] AS [UNIQUEIDENTIFIER])
    FROM   (
                SELECT '5D944516-98E6-44C5-849F-9C277833C01B' Collate Latin1_General_100_BIN AS [INPUT]
                UNION ALL
                SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}'
                UNION ALL
                SELECT '5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
                UNION ALL
                SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss'
                UNION ALL
                SELECT 'ÀD944516-98E6-44C5-849F-9C277833C01B'
                UNION ALL
                SELECT 'fish'
            ) [A]
    WHERE   PATINDEX('[^0-9A-F-{}]%', [A].[INPUT]) = 0
    
  9. ==============================

    9.당신은 당신의 자신의 UDF를 작성할 수 있습니다. 이 어셈블리 SQL-CLR의 사용을 피하기 위해 간단한 근사하다.

    당신은 당신의 자신의 UDF를 작성할 수 있습니다. 이 어셈블리 SQL-CLR의 사용을 피하기 위해 간단한 근사하다.

    CREATE FUNCTION dbo.isuniqueidentifier (@ui varchar(50))  
    RETURNS bit AS  
    BEGIN
    
    RETURN case when
        substring(@ui,9,1)='-' and
        substring(@ui,14,1)='-' and
        substring(@ui,19,1)='-' and
        substring(@ui,24,1)='-' and
        len(@ui) = 36 then 1 else 0 end
    
    END
    GO
    

    그런 다음 키우면 경우 단지 HEX 값에 대한 확인을 향상시킬 수 있습니다.

  10. ==============================

    10.나는 사용한다 :

    나는 사용한다 :

    ISNULL(convert(nvarchar(50), userID), 'NULL') = 'NULL'
    
  11. ==============================

    11.내가 생성 된 필드에 대해 기본적으로 GUID를 사용 AutoFixture으로 생성 된 일부 테스트 사용자를했다. 내가 삭제해야하는 사용자를위한 내 FIRSTNAME 필드의 GUID 또는 uniqueidentifiers 있습니다. 그게 내가 여기 종료 방법입니다.

    내가 생성 된 필드에 대해 기본적으로 GUID를 사용 AutoFixture으로 생성 된 일부 테스트 사용자를했다. 내가 삭제해야하는 사용자를위한 내 FIRSTNAME 필드의 GUID 또는 uniqueidentifiers 있습니다. 그게 내가 여기 종료 방법입니다.

    나는이에 답의 일부를 함께 자갈 수 있었다.

    [회원] FROM SELECT 사용자 아이디. [사용자 정보] 여기서 TRY_CONVERT (고유 식별자, 이름)이없는 널

  12. ==============================

    12.MYSQL에 대한 사용 RLIKE

    MYSQL에 대한 사용 RLIKE

    SELECT 1 WHERE @StringToCompare
    RLIKE REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
    
  13. from https://stackoverflow.com/questions/4649317/how-to-check-if-a-string-is-a-uniqueidentifier by cc-by-sa and MIT license