替换始终替换空值

时间:2010-05-03 18:50:17

标签: sql-server tsql sql-server-2000

为什么

left(FIELD, replace(nullif(charindex('-', FIELD), 0), null, len(FIELD)))

总是返回null?查询背后的想法是,如果charindex()返回0,则将结果转换为null,然后将null转换为字段的长度。因此,如果' - '不存在,则显示整个字符串。由于某种原因,它使每一行都等于null。

谢谢。

3 个答案:

答案 0 :(得分:1)

因为如果任何一个参数为NULL,REPLACE()将返回NULL。在文档中说的是这样的。

请改为:

select isnull(nullif(charindex(' ',field),0),len(field))

答案 1 :(得分:0)

因此,如果字段包含“ - ”,则显示长度。如果没有“ - ”,请显示字段?

CASE
    WHEN FIELD NOT LIKE '%-% THEN FIELD
    ELSE CAST(LEN (FIELD) AS varchar(4))
END

您需要强制转换以避免数据类型优先级

如果希望NULL FIELD以不同的方式工作(它将转到ELSE子句)

,则翻转条件

答案 2 :(得分:0)

当你说then convert the null into the length of the field时,你的意思是将Null转换为一系列空格,如下所示:

Select
    Case
    When Field Like '%-%' Then Replicate(' ', Len(Field))
    Else Field
    End