문자열이 고유 식별자인지 확인하는 방법은 무엇입니까?
고유 식별자(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
'programing' 카테고리의 다른 글
Roxygen2를 사용하여 S4 클래스 슬롯을 올바르게 문서화하는 방법은 무엇입니까? (0) | 2023.07.16 |
---|---|
막대 차트에 값 레이블을 추가하는 방법 (0) | 2023.07.16 |
VueX 및 Laravel Passport를 사용한 인증 (0) | 2023.07.11 |
where 절에서 이상한 임의 동작 (0) | 2023.07.11 |
데이터베이스에서 CSV 파일로 테이블 내보내기 (0) | 2023.07.11 |