SQL以条件方式格式化字符串,例如在大(大写)和小写字母之间插入空格

时间:2011-08-30 14:33:29

标签: sql-server-2005 tsql

我正在我的一个应用程序中从数据库列生成用户界面标签。在这样做时,我遇到了一个问题。在我希望更改的UI中显示与我的数据库表中相同的列名 我有这样的样本数据:

ProductionIssueID
MAXSerialNo
ProductID
Item

我希望将它们格式化为:

Production Issue ID
MAX Serial No
Product ID
Item

逻辑是:
1.当大写字母表成功填写小字母表时,必须插入一个空格,如生产问题ID中所示 2.当小字母表成功填写大写字母时,必须插入空格,如MAX序列号和产品编号
所示 3.如果只有一个大写字母,则无需像项目那样进行任何操作 4.类似的一对大写/小字母之间不需要空格。

请帮助我实现这一目标。这些例子更具描述性。

提前感谢您宝贵的时间和精力。

3 个答案:

答案 0 :(得分:2)

我同意这应该在表示层上完成。但是,此功能可以满足您的需求。

CREATE FUNCTION [dbo].[fn_InitCapWord] ( @InputString varchar(1000) ) 
RETURNS VARCHAR(1000)
AS
BEGIN

DECLARE @Index          INT
DECLARE @OutputString   VARCHAR(1000)
DECLARE @substr  VARCHAR(1000)

SET @OutputString = ''

WHILE (LEN(@InputString) > 0)
BEGIN
    IF (SUBSTRING(@InputString ,2,1) COLLATE Latin1_General_BIN LIKE '%[A-Z]%')
            SELECT @Index = PATINDEX('%[a-z]%',SUBSTRING(@InputString,2,999) COLLATE Latin1_General_BIN) -1
    ELSE
            SELECT @Index = PATINDEX('%[A-Z]%',SUBSTRING(@InputString,2,999) COLLATE Latin1_General_BIN)  

    SELECT @substr = 
        CASE WHEN @Index >= 1 
            THEN  SUBSTRING(@InputString,1,@Index)
            ELSE  @InputString
        END                     
    SELECT @OutputString = @OutputString + RTRIM(@substr) + ' '
    SELECT @InputString = RIGHT(@InputString,CASE WHEN @Index<=0 THEN 0 ELSE LEN(@InputString) - @Index END)
END 

RETURN RTRIM(@OutputString)
END

示例:

PRINT dbo.fn_InitCapWord('ProductionIssueID')
PRINT dbo.fn_InitCapWord('MAXSerialNo')
PRINT dbo.fn_InitCapWord('ProductID')
PRINT dbo.fn_InitCapWord('Item')

输出:

Production Issue ID
MAX Serial No
Product ID
Item

<强>更新 我改变了功能。它应该能够处理空间。

PRINT dbo.fn_InitCapWord('Production IssueID')

输出:

Production Issue ID

答案 1 :(得分:0)

SQL意味着/善于处理关系数据。在演示方面进行字符串操作总是一个好习惯。 如果你仍然想要你可以创建一个CLR功能并使用它。

答案 2 :(得分:0)

我同意这纯粹是一个演示问题,最好在表示层完成。这里有一个先前的问题,给你一些建议(有和没有正则表达式)

add-spaces-before-capital-letters