programing

문자열이 고유 식별자인지 확인하는 방법은 무엇입니까?

skycolor 2023. 7. 11. 21:57
반응형

문자열이 고유 식별자인지 확인하는 방법은 무엇입니까?

고유 식별자(SQL Server)에 대해 IsDate 또는 IsNumeric에 해당합니까?아니면 (C#) TryParse에 해당하는 것이 있습니까?

그렇지 않으면 저는 제 기능을 직접 작성해야 합니다. 하지만 저는 제가 바퀴를 재창조하는 것이 아닌지 확인하고 싶습니다.

제가 다루려고 하는 시나리오는 다음과 같습니다.

SELECT something FROM table WHERE IsUniqueidentifier(column) = 1

SQL Server 2012를 통해 이 모든 것을 훨씬 쉽게

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

이전 버전의 SQL Server의 경우 기존 답변에는 몇 가지 사항이 누락되므로 SQL Server가 실제로 캐스트할 문자열과 일치하지 않을 수 있습니다.UNIQUEIDENTIFIER불만 없이 또는 여전히 유효하지 않은 주조 오류를 야기할 수 있습니다.

SQL Server는 다음과 같이 포장된 GUID를 수락합니다.{}아니면 이것 없이.

또한 문자열 끝에 있는 외부 문자도 무시합니다.둘다요.SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)그리고.SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)예를 들면 성공합니다.

대부분의 기본 데이터 정렬에서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 + '}%' 

내 것이 아니라, 온라인에서 이걸 발견했어요.내가 나눠야겠다고 생각했습니다.

SELECT 1 WHERE @StringToCompare LIKE 
       REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]');
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]');

저는 당신이 "상자 밖에서" 사용할 수 있는 것에 대해 아무것도 모릅니다. 유감스럽게도 당신은 이것을 스스로 써야 할 것입니다.

가능한 경우: C# 라이브러리 내에서 작성하여 SQL-CLR 어셈블리로 SQL Server에 배포해 보십시오. 그러면 다음과 같은 기능을 사용할 수 있습니다.Guid.TryParse()확실히 T-SQL의 어떤 것보다 훨씬 사용하기 쉽습니다.

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

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

URL 문자열 내에서 Guid를 찾는 데 사용해야 했습니다.

HTH

데이브

단순하게 유지하는 것을 좋아합니다.GUID에는 4개가 있습니다(단순 문자열인 경우에도).

WHERE 열(예: '%-%-%-%')

더 오래된 직책이지만, 빠른 테스트를 위한 생각일 뿐입니다...

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

이것은 일부 이전 주석의 개념에 기반한 기능입니다.이 기능은 매우 빠릅니다.

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!

*/
DECLARE @guid_string nvarchar(256) = 'ACE79678-61D1-46E6-93EC-893AD559CC78'

SELECT
    CASE WHEN @guid_string LIKE '________-____-____-____-____________'
    THEN CONVERT(uniqueidentifier, @guid_string)
    ELSE NULL
END

자신만의 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 값에 대한 것인지 확인하도록 개선할 수 있습니다.

사용:

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

생성된 필드에 기본적으로 GUID를 사용하는 AutoFix를 사용하여 생성된 테스트 사용자가 몇 명 있었습니다.삭제해야 하는 사용자의 이름 필드는 GUID 또는 고유 식별자입니다.그래서 여기까지 오게 된 거예요.

저는 당신의 대답을 이것에 엮어낼 수 있었습니다.

SELECT UserId FROM [Membership].[UserInfo] Where TRY_CONVERT(uniqueidentifier, FirstName) is not null

MYSQL에 RLIKE 사용

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

가장 간단한 시나리오입니다.주어진 문자열에 4개의 '-' 기호를 포함할 수 없음을 확인할 때.

SELECT * FROM City WHERE Name LIKE('%-%-%-%-%')

BigQuery에서 사용할 수 있습니다.

SELECT * 
FROM table 
WHERE 
  REGEXP_CONTAINS(uuid, REPLACE('^00000000-0000-0000-0000-000000000000$', '0', '[0-9a-fA-F]'))

언급URL : https://stackoverflow.com/questions/4649317/how-to-check-if-a-string-is-a-uniqueidentifier

반응형