TSQL替换长度约束

时间:2012-01-06 22:51:13

标签: sql sql-server sql-server-2008 tsql

因此,FIELD2可以返回两组字段作为单个结果连接,具体取决于Mycondition的值。

我的问题仅在Mycondition = 1

时出现

如果MyCondition = 1,那么我需要连接INT_FIELD_ONE +'A'+ INT_FIELD_TWO。

串联不是问题。

问题是如果INT_FIELD_ONE(为空)+'A'+ INT_FIELD_TWO(为空),那么我必须不返回任何内容。

如果字段ONE和TWO都为空,则我的替换命令将起作用。但是如果只有1是NULL而另一个不是“A”则会被删除。如果1个字段不为空,则A需要保留。

例如:

NULL +'A'+ NULL = Nothing

NULL +'A'+ xxxx = Axxxx

xxxx +'A'+ NULL = xxxxA

因此,我需要使用结果的长度约束>进行TSQL替换。 1

任何想法?

SELECT XXX,

CASE --Case Statement to Return Field2
         WHEN MyCondition = 1 THEN
       --Constraint on the Replace Starts Here
       REPLACE(
       Isnull(CAST(INT_FIELD_ONE AS VARCHAR), '') + 'A' +
       Isnull(CAST(INT_FIELD_TWO AS
                   VARCHAR), '')
         ,'A','')  
ELSE
        REPLACE(
        Coalesce(REPLACE(INT_FIELD_THREE, '', '-'), Isnull(INT_FIELD_THREE, '-'), INT_FIELD_THREE) +
                ' / ' + Coalesce(REPLACE(INT_FIELD_FOUR, '', '-'),
                        Isnull(INT_FIELD_FOUR, '-'), INT_FIELD_FOUR) + ' ', '- / - ',
        '')
END
AS FIELD2


FROM TABLEX

2 个答案:

答案 0 :(得分:3)

怎么样?

CASE WHEN MyCondition = 1 AND (INT_FIELD_ONE IS NOT NULL OR INT_FIELD_TWO IS NOT NULL) THEN concat..
     WHEN MyCondition = 1 THEN NULL -- at that point we know that both are null
     ELSE ... END

请注意,现在在执行concat时不需要REPLACE函数,因为您确定其中一个字段不为null

答案 1 :(得分:2)

…
WHEN MyCondition = 1 THEN
  ISNULL(
    NULLIF(
      ISNULL(CAST(int1 AS VARCHAR), '') + 'A' + ISNULL(CAST(int2 AS VARCHAR), ''),
      'A'
    ),
    ''
  )
…

int1int2都为NULL时,连接的结果将为A。如果表达式返回NULLIF()A将返回NULL,否则它将返回表达式的结果。外部ISNULL()将NULL转换为空字符串或返回其第一个参数所获得的非NULL值。