T-SQL разбить слово на символы - PullRequest
12 голосов
/ 15 декабря 2011

Я искал везде и не могу найти эту реализацию нигде.

Допустим, у меня есть слово: QWERTY

Я хочу получить эту таблицу:

Q
W
E
R
T
Y

Или для QWERTY AnotherWord Я хочу получить

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

Ответы [ 5 ]

26 голосов
/ 15 декабря 2011

Сделай так:

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'
4 голосов
/ 15 декабря 2011

Вот оно:

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
1 голос
/ 11 марта 2019

Вот табличная функция (полученная из реализации временной таблицы aF).Он немного отличается от реализации aF тем, что начинается с @count=1;это исключает постороннее начальное пространство.

CREATE FUNCTION [dbo].[Chars] (@string VARCHAR(max)) 
RETURNS @chars TABLE (character CHAR) 
AS 
  BEGIN 
      DECLARE @count INT, 
              @total INT 

      SELECT @total = Len(@string), 
             @count = 1 

      WHILE @count <= @total 
        BEGIN 
            INSERT INTO @chars 
            SELECT Substring(@string, @count, 1) 

            SELECT @count = @count + 1 
        END 

      RETURN 
  END 

Использование:

SELECT * FROM dbo.chars('QWERTY AnotherWord')
1 голос
/ 28 июня 2017
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)
1 голос
/ 01 октября 2015

Пожалуйста, ПОЖАЛУЙСТА, избегайте ссылок на системные таблицы, особенно системные таблицы в системных базах данных. Фактически, выбранный выше ответ, вероятно, не будет компилироваться в проекте базы данных Visual Studio 2013

Табличные переменные в порядке, но рекурсия с CTE является ответом:

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

Тем не менее, использование приведенного выше кода состоит в том, чтобы получить таблицу, полную букв, представляющих различные разрешения для пользователя. Это не способ сделать это. Создайте таблицу с идентификатором, кодом разрешения и описанием, а затем создайте таблицу связи между таблицей пользователей и новой таблицей разрешений. это дает вам те же способности и не заставляет вас решать глупые проблемы, подобные этой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...