Первые два символа в верхнем регистре в столбце таблицы БД - PullRequest
3 голосов
/ 08 октября 2008

У меня есть столбец в таблице базы данных (SQL Server 2005), который содержит такие данные:

TQ7394
SZ910284
T r1534
su8472

Я хотел бы обновить этот столбец, чтобы первые два символа были заглавными. Я также хотел бы удалить любые пробелы между первыми двумя символами. Так что T q1234 станет TQ1234.

Решение должно быть в состоянии справиться с несколькими пробелами между первыми двумя символами.

Возможно ли это в T-SQL? Как насчет ANSI-92? Мне всегда интересно посмотреть, как это делается в других БД, поэтому не стесняйтесь публиковать ответы для PostgreSQL, MySQL и др.

Ответы [ 6 ]

4 голосов
/ 08 октября 2008

Вот решение:

РЕДАКТИРОВАТЬ: Обновлено для поддержки замены нескольких пробелов между первым и вторым непробельными символами

/* TEST TABLE */
DECLARE @T AS TABLE(code Varchar(20))
INSERT INTO @T SELECT 'ab1234x1'   UNION SELECT ' ab1234x2' 
         UNION SELECT '  ab1234x3' UNION SELECT 'a b1234x4' 
         UNION SELECT 'a  b1234x5' UNION SELECT 'a   b1234x6' 
         UNION SELECT 'ab 1234x7'  UNION SELECT 'ab  1234x8' 

SELECT * FROM @T
/* INPUT
    code
    --------------------
      ab1234x3
     ab1234x2
    a   b1234x6
    a  b1234x5
    a b1234x4
    ab  1234x8
    ab 1234x7
    ab1234x1
*/

/* START PROCESSING SECTION */
DECLARE @s Varchar(20)
DECLARE @firstChar INT
DECLARE @secondChar INT

UPDATE @T SET
     @firstChar = PATINDEX('%[^ ]%',code)
    ,@secondChar = @firstChar + PATINDEX('%[^ ]%',  STUFF(code,1, @firstChar,'' ) )
    ,@s = STUFF(
            code,
            1,
            @secondChar,
            REPLACE(LEFT(code,
                    @secondChar
                ),' ','')
        ) 
     ,@s = STUFF(
            @s, 
            1,
            2,
            UPPER(LEFT(@s,2))
        )
    ,code = @s
/* END PROCESSING SECTION */

SELECT * FROM @T
/* OUTPUT
    code
    --------------------
    AB1234x3
    AB1234x2
    AB1234x6
    AB1234x5
    AB1234x4
    AB  1234x8
    AB 1234x7
    AB1234x1
*/
3 голосов
/ 08 октября 2008
UPDATE YourTable 
SET YourColumn = UPPER(
                   SUBSTRING(
                     REPLACE(YourColumn, ' ', ''), 1, 2
                   )
                 ) 
                 + 
                 SUBSTRING(YourColumn, 3, LEN(YourColumn))
2 голосов
/ 08 октября 2008

UPPER не повредит никаким числам, поэтому, если приведенные вами примеры являются полностью репрезентативными, в этом нет никакого вреда:

UPDATE tbl
SET col = REPLACE(UPPER(col), ' ', '')
1 голос
/ 08 октября 2008

Образцы данных имеют только пробелы и строчные буквы в начале. Если это верно для реальных данных, то просто:

UPPER(REPLACE(YourColumn, ' ', '')) 

Для более конкретного ответа я бы вежливо попросил вас расширить вашу спецификацию, в противном случае мне пришлось бы кодировать все другие возможности (например, значения менее трех символов), не зная, переусердствовал ли я в своем решении обрабатывать данные, которые на самом деле не возникали бы:)

Как всегда, после того, как вы исправили данные, установите ограничение базы данных, чтобы убедиться, что неверные данные не повторяются, например.

  ALTER TABLE YourTable ADD
     CONSTRAINT YourColumn__char_pos_1_uppercase_letter
        CHECK (ASCII(SUBSTRING(YourColumn, 1, 1)) BETWEEN ASCII('A') AND ASCII('Z'));

  ALTER TABLE YourTable ADD
     CONSTRAINT YourColumn__char_pos_2_uppercase_letter
        CHECK (ASCII(SUBSTRING(YourColumn, 2, 1)) BETWEEN ASCII('A') AND ASCII('Z'));

@ huo73: у вас не работает на SQL Server 2008: я получаю «TRr1534» вместо «TR1534».

0 голосов
/ 08 октября 2008

Если вы делаете ОБНОВЛЕНИЕ, я бы сделал это в 2 шага; во-первых, избавьтесь от пробела (RTRIM на SUBSTRING), а во-вторых сделайте UPPER на первых 2-х символах:

// uses a fixed column length - 20-odd in this case
UPDATE FOO
SET bar = RTRIM(SUBSTRING(bar, 1, 2)) + SUBSTRING(bar, 3, 20)

UPDATE FOO
SET bar = UPPER(SUBSTRING(bar, 1, 2)) + SUBSTRING(bar, 3, 20)

Если вам это нужно в SELECT (т. Е. В строке), то у меня возникнет соблазн написать скалярный UDF

0 голосов
/ 08 октября 2008
update Table set Column = case when len(rtrim(substring (Column , 1 , 2))) < 2 
            then UPPER(substring (Column , 1 , 1) + substring (Column , 3 , 1)) + substring(Column , 4, len(Column)
            else UPPER(substring (Column , 1 , 2)) + substring(Column , 3, len(Column) end

Это работает на том факте, что если есть пробел, то обрезка этой части строки даст длину меньше 2, поэтому мы разбиваем строку на три и используем верхний на 1-м и 3-м символах. Во всех остальных случаях мы можем разбить строку на 2 части и использовать верхний, чтобы первые два символа были заглавными.

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