SQL для форматирования строк условным способом, например вставка пробелов между большими (заглавными) и строчными буквами - PullRequest
0 голосов
/ 30 августа 2011

Я генерирую метки пользовательского интерфейса из столбцов базы данных в одном из моих приложений. При этом я столкнулся с проблемой. В пользовательском интерфейсе отображаются те же имена столбцов, что и в моей таблице базы данных, которые я хочу изменить.
У меня есть пример данных, как это:

ProductionIssueID
MAXSerialNo
ProductID
Item

Я хочу отформатировать их так:

Production Issue ID
MAX Serial No
Product ID
Item

Логика:
1. Если заглавный алфавит заменяет маленький алфавит, необходимо вставить пробел, как показано в идентификаторе производственного выпуска
2. Если после маленького алфавита стоит заглавная, необходимо вставить пробел, как указано в MAX Serial No и Product ID
3. Если есть только один заглавный алфавит, ничего не нужно делать, как в пункте
4. Между аналогичной парой прописных / маленьких алфавитов не требуется места.

Пожалуйста, помогите мне достичь этого. Примеры являются более наглядными.

Заранее благодарим за ваше драгоценное время и усилия.

Ответы [ 3 ]

2 голосов
/ 30 августа 2011

Я согласен, что это должно быть сделано на уровне представления. Однако эта функция может получить то, что вам нужно.

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

UPDATE: Я изменил функцию. Теперь он должен обрабатывать пространство.

PRINT dbo.fn_InitCapWord('Production IssueID')

ВЫВОД:

Production Issue ID
0 голосов
/ 30 августа 2011

Я согласен, что это чисто вопрос презентации, и лучше всего это делать на уровне презентации. Здесь есть предыдущий вопрос, который дает вам несколько советов (как с регулярным выражением, так и без него)

адд-пространства-до-капитальной буквы

0 голосов
/ 30 августа 2011

SQL предназначен / хорош для обработки реляционных данных. Всегда полезно выполнять манипуляции со строками на стороне презентации. Если вы все еще хотите, вы можете создать функцию CLR и использовать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...