【问题标题】:Add a '-' in a varchar SQL在 varchar SQL 中添加“-”
【发布时间】:2015-03-23 15:18:32
【问题描述】:

我需要从这种格式转换一些字符串:

"1020202020"

"1-0-2-0-2-0-2-0-2-0"

我怎样才能以简单的方式做到这一点?

谢谢

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    每天醒来,我都会想“今天 CTE 会让什么不可能的事情成为可能?”

    ;with cte as (
        select 
            '1020202020' inputstring,
            convert(varchar(max),'') outputstring
        union all
        select
            substring(inputstring,2,len(inputstring)),
            outputstring + left(inputstring,1) + '-' + case when len(inputstring) = 2 then right(inputstring,1) else '' end
        from cte
        where len(inputstring) > 1
    )
    select top 1 outputstring from cte order by len(outputstring) desc
    

    【讨论】:

    • 发布10秒后接受??
    • 做了一个小的调整。不需要“X”填充字符串。
    【解决方案2】:

    您的问题不清楚关于连字符位置的确切规则。 所以,可能会有一些巧妙的方法使用replace()

    对于您的示例字符串:

    select replace(replace(col, '02', '-0-2'), '20', '2-0')
    

    【讨论】:

    • 其实我觉得很简单,在所有字符之间加一个连字符。我猜this method 应该与this 结合使用(以1 作为参数)。但是,必须删除最后一个连字符。
    【解决方案3】:

    我会这样处理:

    TRIM(TRAILING "-" FROM REPLACE("10203040", "0", "-0-"))
    

    【讨论】:

    • 是什么让你觉得零有什么特别之处?
    • 好吧,问题是:“...这种格式:1020202020 ...”
    【解决方案4】:

    这是一个非循环/非递归的解决方案。我对 REPLACE() 有一些乐趣,它非常有效。它可以在不到一秒的时间内处理 100,000 行,这可能比任何循环或递归解决方案都要好。

    IF OBJECT_ID('strings') IS NOT NULL
        DROP TABLE strings;
    
    CREATE TABLE strings (string BIGINT);
    
    --Populate the table
    WHILE(SELECT COUNT(*) FROM strings) < 100000
    BEGIN
        INSERT INTO strings
            SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL
            SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL
            SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL
            SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL
            SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000
    END
    
    --Add the hyphens with REPLACE() and cut off the extra hyphen at the end with SUBSTRING()
    SELECT SUBSTRING(
                    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(string, '0', '0-'),'1','1-'),'2','2-'),'3','3-'),'4','4-'),'5','5-'),'6','6-'),'7','7-'),'8','8-'),'9','9-'),
                    0,
                    LEN(string)*2
                    ) AS String
    FROM strings;
    

    缩写结果:

    String
    ------------------------
    5-6-1-2-9-4-9-0-8-1
    7-5-8-5-1-9-3-0-9
    2-2-4-7-6-1-5-7-6-9
    9-3-4-6-1-0-3-5-0
    9-9-5-3-6-8-8-7-8-9
    5-3-7-2-0-5-3-0-6
    8-4-0-8-9-8-9-4-5-0
    9-8-6-4-6-8-4-4-3-9
    6-6-5-8-2-8-7-3-9-2
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2021-06-23
      • 2015-05-12
      相关资源
      最近更新 更多