2011-12-15 10 views
8

Szukałem wszędzie i nie mogę znaleźć tej implementacji w dowolnym miejscu.T-SQL Podziel słowo na znaki

Powiedzmy mam słowo: QWERTY

Chcę uzyskać tę tabelę:

Q 
W 
E 
R 
T 
Y 

Lub QWERTY AnotherWord Chcę uzyskać

Q 
W 
E 
R 
T 
Y 
[space character here] 
A 
n 
o 
t 
h 
e 
r 
W 
o 
r 
d 
+0

To jest duplikatem http://stackoverflow.com/questions/697519/split-function-equivalent-in-tsql –

+1

Niestety, google i stackoverflow wyszukiwanie nie zwróciło żadnych Userful wyników. Z drugiej strony widzę, że udzielona tu odpowiedź jest lepsza i szybsza, i lepiej pasuje do mojej potrzeby rozwiązania. Sądzę też, że jest to bardziej proste. –

Odpowiedz

19

Czy to tak:

select substring(a.b, v.number+1, 1) 
from (select 'QWERTY AnotherWord' b) a 
join master..spt_values v on v.number < len(a.b) 
where v.type = 'P' 
+0

hi @ t-clausen.dk, rozwiązanie nie działa w bazie danych SQL Azure. Czy masz jakieś inne opcje? –

3

Tutaj masz go:

create table #words (
    character varchar(1) 
) 

declare @test varchar(10) 
select @test = 'QWERTY' 

declare @count int, @total int 
select @total = len(@test), @count = 0 

while @count <= @total 
begin 
    insert into #words select substring(@test, @count, 1) 
    select @count = @count + 1 
end 

select * from #words 

drop table #words 
+0

Dziękuję. Działa również, ale chcę uniknąć używania tabel tymczasowych. Myślę, że mógłbym używać tabel zmiennych. +1 –

0

proszę, proszę uniknąć odwoływania stoły systemy, w szczególności tabele systemowe bazy danych systemu. W rzeczywistości, wybrana odpowiedź powyżej prawdopodobnie nie będzie kompilacji w Visual Studio 2013 Database Projekt

zmienne Tabela są w porządku, ale rekursji z CTE jest odpowiedź:

DECLARE @str VARCHAR(max) 
SET @str = 'QWERTY AnotherWord' 
WITH Split(stpos,endpos) 
AS(
SELECT 1 AS stpos, 2 AS endpos 
UNION ALL 
SELECT endpos, endpos+1 
FROM Split 
WHERE endpos <= LEN(@str) 
) 
SELECT 
    'character' = SUBSTRING(@str,stpos,COALESCE(NULLIF(endpos,0),LEN(@str)+1)-stpos) 
    ,'charindex' = stpos 
FROM Split 

Powiedział, że wykorzystanie do powyższy kod polega na uzyskaniu tabeli pełnej liter reprezentujących różne uprawnienia dla użytkownika. To nie jest sposób, aby to zrobić. Stwórz tabelę z identyfikatorem, kodem dostępu i opisem, a następnie stwórz tabelę łączącą między tabelą użytkowników a nową tabelą uprawnień. to daje ci te same możliwości i nie sprawia, że ​​rozwiązujesz głupie problemy w ten sposób.

1
Declare @word nvarchar(max) 
Select @word = 'Hello This is the test'; 

with cte (Number)as 
(Select 1 
union all 
select Number +1 From cte where number <len(@word) 
) 
select * from Cte Cross apply (Select SUBSTRING(@word,number,1)) as J(Letter) 
+0

Ogólnie odpowiedzi są o wiele bardziej pomocne, jeśli zawierają wyjaśnienie, co zamierza zrobić kod i dlaczego rozwiązuje problem bez wprowadzania innych. – Peter

+0

Dobre rozwiązanie, zastosowanie cross i cte. – Matthias

Powiązane problemy