有条件地格式化不一致的用户输入字符串

时间:2017-06-23 20:18:01

标签: sql-server tsql

我有一个自由形式的字符串字段,用户输入一组值。这使用户能够以任何方式输入信息,但也会出现格式不一致的情况。出于数据清理的目的,我想将字符串格式化为标准,无论它们如何输入。例如,我有以下数据集。注意如何以各种格式输入冒号。

Description
---------------------------
ARCHIVE PERSONNEL FOLDERS : INACTIVE
ACTIVE PERSONNEL FOLDERS: ACTIVE
ACTIVE AUDIT FOLDERS :ACTIVE
UNKNOWN AUDIT FOLDERS:ACTIVE
ABC CLIENT FOLDERS  : INACTIVE
DEF CLIENT FOLDERS :  ACTIVE

我想格式化字符串,以便冒号立即附加到它之前的单词,并且后面有一个空格。

Description
---------------------------
ARCHIVE PERSONNEL FOLDERS: INACTIVE
ACTIVE PERSONNEL FOLDERS: ACTIVE
ACTIVE AUDIT FOLDERS: ACTIVE
UNKNOWN AUDIT FOLDERS: ACTIVE
ABC CLIENT FOLDERS: INACTIVE
DEF CLIENT FOLDERS: ACTIVE

根据需要格式化数据的最佳方法是什么,并考虑任何不正确的冒号格式(前面的空格,没有空格,前后空格,前面两个空格等)?

2 个答案:

答案 0 :(得分:3)

无论冒号前后的空格数是多少,这都应该有效

declare @table table([Description] varchar(256))
insert into @table
values
('ARCHIVE PERSONNEL FOLDERS : INACTIVE'),
('ACTIVE PERSONNEL FOLDERS: ACTIVE'),
('ACTIVE AUDIT FOLDERS :ACTIVE'),
('UNKNOWN AUDIT FOLDERS:ACTIVE'),
('ABC CLIENT FOLDERS  : INACTIVE'),
('DEF CLIENT FOLDERS :  ACTIVE')

select
    [Description]
    ,rtrim(substring([Description],0,CHARINDEX(':',[Description]))) + ': ' + ltrim(substring([Description],CHARINDEX(':',[Description])+1,len([Description])))
from
    @table

答案 1 :(得分:1)

<强>假设:

在提出这个答案时我做了几个假设。如果这些假设无效,可以采用这些假设的解决方法,但认为最好从最简单的方案开始。

1)在自由形式字符串字段中永远不会输入.

2)自由形式字符串字段中不会包含多个:

示例数据设置:

declare @table table
    (
        description varchar(100) not null
    )

insert into @table
    values  ('ARCHIVE PERSONNEL FOLDERS : INACTIVE')
            , ('ACTIVE PERSONNEL FOLDERS: ACTIVE')
            , ('ACTIVE AUDIT FOLDERS :ACTIVE')
            , ('UNKNOWN AUDIT FOLDERS:ACTIVE')
            , ('ABC CLIENT FOLDERS  : INACTIVE')
            , ('DEF CLIENT FOLDERS :  ACTIVE')

<强>答案:

就像Lewis Therin在问题评论中所说,REPLACE在这里非常有用。它将有助于为记录的目的外部设置,但可靠地使用名为parsename的函数。

下面的select语句根据:的位置将每个字符串拆分为两个,从每个字符串中删除任何多余的空格,然后将它们与指定的:连接在一起。 (他们之间有空格冒号)。

select rtrim(ltrim(parsename(replace(t.description, ':', '.'), 2))) + ': ' + rtrim(ltrim(parsename(replace(t.description, ':', '.'), 1))) as description
from @table as t

<强>结果:

Description
-------------------------------------
ARCHIVE PERSONNEL FOLDERS: INACTIVE
ACTIVE PERSONNEL FOLDERS: ACTIVE
ACTIVE AUDIT FOLDERS: ACTIVE
UNKNOWN AUDIT FOLDERS: ACTIVE
ABC CLIENT FOLDERS: INACTIVE
DEF CLIENT FOLDERS: ACTIVE