垂直输出

时间:2012-10-12 16:44:03

标签: oracle sql-server-2008 oracle10g

我在表格中有列名:

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

并输出上述查询

LASTNAME
Smith

我想输出

   LASTNAME
      S
      m
      i
      t
      h

3 个答案:

答案 0 :(得分:2)

numbers table的帮助下。

SQL Server:

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

答案 1 :(得分:1)

在SQL Server中,如果您没有数字表,则可以使用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

答案 2 :(得分: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 @lastlen=@lastlen+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>=@endrow
BEGIN
INSERT INTO @Finalname
Select strval from [dbo].[SPLIT_test] ((SELECT name FROM @name where row=@endrow))         WHERE strval<>''-- removing empty spaces
SET @endrow=@endrow+1
END
SELECT * FROM @Finalname