2017-02-17 83 views
0

我查看了答案并找到了我正在查找的内容,但是我无法将其适用于我的查询。我如何将数字分成3个部分除以MYSQL中的“ - ”

我有一个看起来像这样的数字。 1110010001.我想把它看起来像这样。 111-001-0001(或任何其他分频器)。

我知道如何获得111-0010001,但任何人都可以告诉我如何将下面的代码修改为返回111-001-0001吗?

SELECT  
CASE 
WHEN floor(substr(p.rrnhs, 3,1)) > 0 
THEN CONCAT_WS('-', SUBSTRING(p.rrnhs, 1, 3), SUBSTRING(p.rrnhs, 3, LENGTH(p.rrnhs))) 
ELSE CONCAT_WS('-', SUBSTRING(p.rrnhs, 1, 3), SUBSTRING(p.rrnhs, 4, 3ENGTH(p.rrnhs))) 
END AS 'NHSNo', 

感谢,

迈克

回答

1

3段,只需添加另一个子段

SELECT CONCAT_WS('-', SUBSTRING(p.rrnhs, 1, 3), 
       SUBSTRING(p.rrnhs, 4, 3),SUBSTRING(p.rrnhs, 7, LENGTH(p.rrnhs))) FROM T 

Test

+1

啊!我确实尝试过,但无法做到。这虽然工作得很好。谢谢! –

1

你也可以这样做

select concat(substring('1110010001',1,3), 
'-',substring('1110010001',4,3),'-',substring('1110010001',7)) this; 
0

不是最好的代码,但也许你可以找到有用的。我只是做了一个存储过程,以动态的方式实现你的目标。

利用此存储过程,你可以参数化:

  • 字符串分割
  • 字符数在每分裂块
  • 分裂的块数。

    DELIMITER $$ 
    
    CREATE PROCEDURE `stringSplitter`(IN stringToSplit TEXT, IN numberOfCharactersSplitted INT, IN numberOfSplits INT) 
    BEGIN 
    
    DECLARE iteration INT DEFAULT 1; 
    DECLARE indexToSplit INT DEFAULT 1; 
    DECLARE maxIterations INT; 
    DECLARE result TEXT;    
    DECLARE size INT; 
    
    SET maxIterations = LENGTH(stringToSplit)/numberOfCharactersSplitted; 
    SET size = LENGTH(stringToSplit); 
    SET indexToSplit = 1; 
    SET result = ""; 
    
    WHILE (iteration <= numberOfSplits AND indexToSplit < size) DO  
        SET result = CONCAT(result, substring(stringToSplit,indexToSplit,numberOfCharactersSplitted), '_'); 
        SET indexToSplit = indexToSplit + numberOfCharactersSplitted; 
        SET iteration = iteration + 1; 
    END WHILE; 
    
    SET result = CONCAT(result, substring(stringToSplit,indexToSplit,size)); 
    
    SELECT result; 
    
    END$$ 
    
    DELIMITER ; 
    

当心!我没有测试过那么多,但我认为你可以毫无问题地使用它。

相关问题