모든 행에서 단일 varchar (50) 열의 모든 고유 문자를 찾는 우아한 방법이 SQL Server에 있습니까?SQL : 모든 행에서 열의 모든 고유 문자를 가져 오는 방법
productname
-----------
product1
widget2
nicknack3
문자의 별개의 재고가 "productwigenka123"
모든 행에서 단일 varchar (50) 열의 모든 고유 문자를 찾는 우아한 방법이 SQL Server에 있습니까?SQL : 모든 행에서 열의 모든 고유 문자를 가져 오는 방법
productname
-----------
product1
widget2
nicknack3
문자의 별개의 재고가 "productwigenka123"
열이 varchar이면 주어진 코드 페이지에서 0에서 255까지의 문자 만 저장할 수 있다는 의미입니다. 32-128 ASCII 코드 범위 만 사용하는 경우 32-128 문자가 하나씩 있는지 간단하게 확인할 수 있습니다. 다음 쿼리는 않습니다, 그 sys.objects.name에서 찾고 :
with cteDigits as (
select 0 as Number
union all select 1 as Number
union all select 2 as Number
union all select 3 as Number
union all select 4 as Number
union all select 5 as Number
union all select 6 as Number
union all select 7 as Number
union all select 8 as Number
union all select 9 as Number)
, cteNumbers as (
select U.Number + T.Number*10 + H.Number*100 as Number
from cteDigits U
cross join cteDigits T
cross join cteDigits H)
, cteChars as (
select CHAR(Number) as Char
from cteNumbers
where Number between 32 and 128)
select cteChars.Char as [*]
from cteChars
cross apply (
select top(1) *
from sys.objects
where CHARINDEX(cteChars.Char, name, 0) > 0) as o
for xml path('');
것 :이 커서 : 예를 들어
없이 할 수 있으면
보너스 포인트는 말을 내 데이터는 3 행이 포함 순차적 인 정수리스트를 가지고있는 Numbers 나 Tally 테이블을 가지고 있다면 다음과 같이 할 수 있습니다 :
Select Distinct '' + Substring(Products.ProductName, N.Value, 1)
From dbo.Numbers As N
Cross Join dbo.Products
Where N.Value <= Len(Products.ProductName)
For Xml Path('')
여기
With Numbers As
(
Select Row_Number() Over (Order By c1.object_id) As Value
From sys.columns As c1
Cross Join sys.columns As c2
)
Select Distinct '' + Substring(Products.ProductName, N.Value, 1)
From Numbers As N
Cross Join dbo.Products
Where N.Value <= Len(Products.ProductName)
For Xml Path('')
당신은 SQL Server 2005 및 이상 사용하는 경우, 당신은 CTE를 사용하여 비행에 숫자 테이블을 생성 할 수 있습니다 . 테이블이라고 가정하면 '제품'
WITH ProductChars(aChar, remain) AS (
SELECT LEFT(productName,1), RIGHT(productName, LEN(productName)-1)
FROM Products WHERE LEN(productName)>0
UNION ALL
SELECT LEFT(remain,1), RIGHT(remain, LEN(remain)-1) FROM ProductChars
WHERE LEN(remain)>0
)
SELECT aChar, COUNT(*) FROM ProductChars
GROUP BY aChar
(질문에 명시된 바와 같이) 하나의 행에 그들 모두를 결합하려면, 위의 멋진 해킹을 사용하는 최종 SELECT
SELECT aChar AS [text()] FROM
(SELECT DISTINCT aChar FROM ProductChars) base
FOR XML PATH('')
에 변경 MySQL에서 GROUP_CONCAT
을 에뮬레이트하는 here을 찾았습니다.
재귀의 첫 번째 수준은 쿼리가 출력에서 빈 문자열을 반환하지 않도록 해제됩니다.
받기 "명령문이 종료되었습니다. 명령문 완료 전에 최대 재귀 100이 모두 소모되었습니다." – Riga
사용이가 (모든 CTE-수있는 RDBMS에서 작동된다) :
create table prod as
select x.v from (values('product1'),('widget2'),('nicknack3')) as x(v);
쿼리 테스트 :
with a as
(
select v, '' as x, 0 as n from prod
union
select v, substring(v,n+1,1) as x, n+1 as n from a where n < len(v)
)
select v, x, n from a -- where n > 0
order by v, n
최종 검색어 :
with a as
(
select v, '' as x, 0 as n from prod
union
select v, substring(v,n+1,1) as x, n+1 as n from a where n < len(v)
)
select distinct x from a where n > 0
order by x
오라클 버전 :
with a(v,x,n) as
(
select v, '' as x, 0 as n from prod
union all
select v, substr(v,n+1,1) as x, n+1 as n from a where n < length(v)
)
select distinct x from a where n > 0
문자 순서가 중요합니까? –
아니요, 문자는 임의의 순서로 반환 될 수 있습니다. – frankadelic