将字符串拆分为以句号分隔的字母(SQL)

时间:2018-10-04 15:55:01

标签: sql sql-server sql-server-2014

我试图编写一个存储过程,该过程接受一个字符串参数,并以句号分隔的每个字符返回它。

例如,我希望SP接受参数DOG并返回D.O.G。

我尝试如下使用STRING_SPLIT函数:

select STRING_SPLIT(@myString, '')

,但它似乎与我使用的SQL版本(2014)不兼容(错误消息说它不是公认的函数)。即使它确实起作用,我也不确定如何插入句号。

似乎应该有一种简单的方法来做到这一点,但我只是找不到它!

如果您需要更多信息,请告诉我。

非常感谢。

4 个答案:

答案 0 :(得分:5)

如果我很好理解,这是我现在可以想到的最好方法,使用问题T-SQL Split Word into characters

的答案
with cte as (
    select
        substring(a.b, v.number+1, 1) as col
        ,rn = ROW_NUMBER() over (order by (select 0))
    from (select 'DOG' b) a
    join master..spt_values v
        on v.number < len(a.b)
    where v.type = 'P'
)
select distinct
    STUFF((SELECT '.' + col FROM cte order by rn FOR XML PATH('')),1,1,'') as col
from cte

答案 1 :(得分:5)

首先误解了问题。此答案使用NGRams8K将参数拆分为字符,然后使用from sqlalchemy import Column, create_engine, engine from sqlalchemy.types import Integer, Float, String, Date conn_string = {'drivername':'postgresql', 'username':'****', 'password':'****', 'host':'****', 'port':5432, 'database':'****'} conn = create_engine(engine.url.URL(**conn_string)) Base = declarative_base() metadata = MetaData(conn) class FOO(Base): """SQLalchemy object representing column types associated with foo table in the MetaData database.""" __tablename__ = 'foo' barbaz = Column(String(), index=True, unique=True, primary_key=True, CheckConstraint('length(barbaz) =10')) name = Column(String(240)) latitude = Column(Float()) longitude = Column(Float()) class PHOO(): __tablename__ = ' ' table_id = Column(Integer, primary_key=True, unique=True, index = True) height = Column(Float(precision=53, asdescimal=True)) width = Column(Float(precision=53, asdescimal=True)) words = Column(String(500)) other_words = Column(String(500)) 将其备份:

FOR XML PATH

答案 2 :(得分:2)

没有内置功能可以完成您要执行的操作,但是您可以使用简单的while循环轻松完成此操作。

遍历字符串中的每个字符并使用CONCAT:

    DECLARE @InputString NVARCHAR(200);
    DECLARE @Seperator CHAR(1);
    DECLARE @OutputString NVARCHAR(MAX);
    DECLARE @Counter INT;

    SET @InputString = N'TestString';
    SET @Seperator = '.';

    SET @Counter = 1;
    WHILE @Counter <= LEN(@InputString)
        BEGIN
            SET @OutputString = CONCAT(
                                         @OutputString
                                       , SUBSTRING(@InputString, @Counter, 1)
                                       , @Seperator
                                     );
            SET @Counter = @Counter + 1;
        END;

    SELECT @OutputString;

答案 3 :(得分:1)

您可以对while使用简单的stuff循环:

declare @s       varchar(max) ='dog'
declare @counter int          = 0
declare @len     int          = len(@s)

while @counter < @len - 1
begin 
    set @s = stuff(@s, @len - @counter, 0, '.')
    set @counter = @counter + 1
end
select @s + '.' as result

由于您输入的是简短的字符串,因此性能并不是一个大问题:我用8000个char字符串测试了此解决方案,结果立即返回。

结果:

enter image description here