REPLACE(<MyColumn> , '', 'foo')
ничего не сделает. REPLACE
заменяет символы во втором параметре на символы в третьем. Ваш второй параметр представляет собой строку длины 0, поэтому не содержит символов для замены.
LEN
не включает конечные пробелы, поэтому строка со значением ' '
вернет 0
для LEN
. Если вы хотите включить конечные пробелы, используйте DATALENGTH
. ЕСЛИ DATALENGTH(<MyColumn>)
возвращает значение больше 0, оно содержит пробелы, если нет, то имеет значение ''
. Использование NULLIF(<MyColumn>,'')
также вернет NULL
для любой строки с нулевой длиной или только содержащей пробелы.
Однако тот факт, что и UNICODE
, и ASCII
return NULL
предполагает, что столбец имеет значение ''
, поскольку строка нулевой длины не может иметь значение ASCII
/ UNICODE
. Это может быть подтверждено приведенными ниже примерами данных:
SELECT V.YourString,
V.StringDescription,
LEN(V.YourString) AS StringLEN, --Will return 0 for all rows
DATALENGTH(V.YourString) AS StringDATALENGTH, --Will return varying results,
REPLACE(V.YourString, '', 'foo') AS StringREPLACEBlank, --Will do nothing, there are no characters to replace
REPLACE(V.YourString, ' ', 'foo') AS StringREPLACEWhiteSpace, --Varying lengths of foo
ASCII(V.YourString) AS StringASCII, --Will return NULL for Empty String
NULLIF(V.YourString,'') AS StringNULLIF --Will return NULL for Empty String
FROM (VALUES('','Empty String'),
(' ','One White Space'),
(' ','Multiple White Space'))V(YourString, StringDescription)
, который возвращает следующий набор данных:
YourString StringDescription StringLEN StringDATALENGTH StringREPLACEBlank StringREPLACEWhiteSpace StringASCII StringNULLIF
---------- -------------------- ----------- ---------------- ------------------ ----------------------- ----------- ------------
Empty String 0 0 NULL NULL
One White Space 0 1 foo 32 NULL
Multiple White Space 0 3 foofoofoo 32 NULL
Причина NULLIF(Column,'')
возвращает NULL
для обоих нулей строки длины и строки, содержащие только пробелы, потому что это сокращенное выражение CASE
. NULLIF(Column,'')
разбирается как CASE WHEN Column = '' THEN NULL ELSE Column END
. При сравнении строк с оператором =
строка с конечными пробелами по сравнению со строкой без них будет рассматриваться как одно и то же значение. Например, ' ' = ''
будет правдой. Это означает, что если Column
имеет значение ' '
, то Column = ''
также будет True, а NULL
будет возвращено NULLIF
.