Sql db表中列中的前两个大写字符

Sql db表中列中的前两个大写字符,sql,sql-server,tsql,language-agnostic,Sql,Sql Server,Tsql,Language Agnostic,我在数据库表(SQL Server 2005)中有一列,其中包含以下数据: TQ7394 SZ910284 T r1534 su8472 我想更新此列,使前两个字符为大写。我还想删除前两个字符之间的任何空格。因此TQ1234将变成TQ1234 解决方案应该能够处理前两个字符之间的多个空格。 这在T-SQL中可能吗?ANSI-92怎么样?我总是很想看看其他数据库是如何做到这一点的,所以请随意发布PostgreSQL、MySQL等的答案。updatetable set Column=case wh

我在数据库表(SQL Server 2005)中有一列,其中包含以下数据:

TQ7394
SZ910284
T r1534
su8472
我想更新此列,使前两个字符为大写。我还想删除前两个字符之间的任何空格。因此
TQ1234
将变成
TQ1234

解决方案应该能够处理前两个字符之间的多个空格。

这在T-SQL中可能吗?ANSI-92怎么样?我总是很想看看其他数据库是如何做到这一点的,所以请随意发布PostgreSQL、MySQL等的答案。

updatetable set Column=case when len(rtrim(substring(Column,1,2))<2
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
然后上(子串(列,1,1)+子串(列,3,1))+子串(列,4,列,len(列) else上部(子字符串(第1列,第2列))+子字符串(第3列,第1列,第2列)末端

这是基于这样一个事实,即如果有一个空格,那么对该部分字符串的修剪将产生小于2的长度,因此我们将字符串拆分为三个,并在第一个和第三个字符上使用upper。在所有其他情况下,我们可以将字符串拆分为两个部分,并使用upper将前两个字符转换为大写。

如果您正在进行更新,我会这样做分两步进行;首先去掉空格(子字符串上的RTRIM),然后在前两个字符上进行上一步:

// 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

UPDATE YourTable 
SET YourColumn = UPPER(
                   SUBSTRING(
                     REPLACE(YourColumn, ' ', ''), 1, 2
                   )
                 ) 
                 + 
                 SUBSTRING(YourColumn, 3, LEN(YourColumn))
编辑:更新以支持在第一个和第二个非空格字符之间替换多个空格

/* 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
*/

UPPER
不会伤害任何数字,因此,如果您给出的示例完全具有代表性,那么执行以下操作实际上没有任何伤害:

UPDATE tbl
SET col = REPLACE(UPPER(col), ' ', '')

示例数据的开头只有空格和小写字母。如果这对实际数据成立,则只需:

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'。

为什么不使用替换(条,,'')在第一个语句中?如果列的第一个字母和第二个字母之间有多个空格,那么您也会得到这些空格。非常喜欢这一个字母的简单性和清晰性。@toast:我想这可以归结为一个适当的规范,说明哪些内容可以/不会被替换,最好是支持测试用例!是的,您可以有很多方法剥猫皮…TQ7394会返回什么?TQ7394?很好。还应该删除多个空格;我将更新问题。我喜欢这样,但它应该只替换前两个字符之间的空格。这将替换所有空格,这对选择查询仍然有用。