2012-10-12 2 views
0

내가 열 테이블의 이름이 :수직 출력

select LASTNAME 
    FROM dbo.Employees 
WHERE LASTNAME = 'Smith' 

및 위의 쿼리의 출력은

LASTNAME 
Smith 

내가 원하는이다의 작은 도움으로

LASTNAME 
     S 
     m 
     i 
     t 
     h 

답변

2

같은 출력 a numbers table.

SQL 서버 :

select substring(E.LASTNAME, N.N, 1) as LASTNAME 
from Employees as E 
    inner join Numbers as N 
    on N.N between 1 and len(E.LASTNAME) 
order by E.LASTNAME, N.N 

오라클 : 당신은 숫자의 테이블이없는 경우

select substr(E.LASTNAME, N.N, 1) as LASTNAME 
from Employees E 
    inner join Numbers N 
    on N.N between 1 and length(E.LASTNAME) 
order by E.LASTNAME, N.N; 

SQL Fiddle

SQL 서버에서
0
----- function for splitting 
CREATE FUNCTION [dbo].[SPLIT_Test] ( 
@string VARCHAR(8000)) 
RETURNS @table TABLE (strval VARCHAR(8000)) 
AS 
BEGIN 
IF LEN(@string)>=1 
BEGIN 
DECLARE @fulllen int=LEN(@string),@lastlen int=0 
WHILE @fulllen>@lastlen 
BEGIN 
INSERT INTO @table 
SELECT SUBSTRING(@string,1,1) 
SET @string= RIGHT(@String, LEN(@String) - 1) 
SET @[email protected]+1 
END 
RETURN 
END 
RETURN 
END 

---- query 
GO 
DECLARE @name table(name varchar(500),row int IDENTITY(1,1)) 
INSERT INTO @name 
select LASTNAME 
    FROM dbo.Employees 
WHERE LASTNAME = 'Smith' 
DECLARE @Finalname table(name varchar(50)) 
DECLARE @startrow int =(SELECT MAX(row) FROM @name) 
,@endrow int =1 
WHILE @startrow>[email protected] 
BEGIN 
INSERT INTO @Finalname 
Select strval from [dbo].[SPLIT_test] ((SELECT name FROM @name where [email protected]))   WHERE strval<>''-- removing empty spaces 
SET @[email protected]+1 
END 
SELECT * FROM @Finalname 
1

, 다음 사용할 수 있습니다 CTE로 목록 생성 :

;with cte (id, start, numb) as 
(
    select id, 1 start, len(lastname) numb 
    from employees 
    union all 
    select id, start + 1, numb 
    from cte 
    where start < numb 
) 
select c.id, substring(e.lastname, c.start, 1) 
from employees e 
inner join cte c 
    on c.start between 1 and len(e.lastname) 
    and c.id = e.id 
order by e.id, e.lastname; 

SQL Fiddle With Demo