0

テーブルに列名があります:

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

上記のクエリの出力は

LASTNAME
Smith

次のような出力が必要です

   LASTNAME
      S
      m
      i
      t
      h
4

3 に答える 3

2

数値表の助けを借りて.

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 フィドル

于 2012-10-12T17:06:52.613 に答える
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を参照してください

于 2012-10-12T21:13:24.933 に答える
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
于 2012-10-12T17:49:24.220 に答える