В моей таблице есть пустые значения, и я не могу их уловить в операторе IF.
я пытался
IF @value = '' и if @value = NULL, и ни один из них не улавливает пустые значения. Есть ли способ проверить, является ли varchar полностью пробелом?
АГА! Оказывается, я неправильно тестировал null. Спасибо.


если длина (@value) = 0 или @value равна нулю
(LTRIM(RTRIM(@Value))=''
должен сделать свое дело.
Для сравнения с NULL используйте ключевое слово IS NULL.
--Generic example:
SELECT *
FROM MY_TABLE
WHERE SOME_FIELD IS NULL;
--Instead of
SELECT *
FROM MY_TABLE
WHERE SOME_FIELD = NULL;
Или ВЫКЛЮЧИТЕ ANSI NULLS - я бы предпочел следовать спецификации SQL-92 tho ', а us IS NULL
Возможно, чего-то не хватает, но это вообще не исправляет способ проверки пробелов. Он исправляет синтаксис проверки на null, но вопрос не об этом.
У вас могут быть поля с несколькими пробелами (''), поэтому вы получите лучшие результаты, если их обрежете:
where ltrim(yourcolumnname) = ''
ltrim(rtrim(isNull(@value,''))) = ''
где length (rtrim (ltrim (yourcolumnname))) = 0 ИЛИ yourcolumnname имеет значение null
Я просто провел небольшое тестирование и обнаружил кое-что интересное. Раньше я писал свои запросы так:
SELECT *
FROM TableA
WHERE Val IS NOT NULL
AND LEN(RTRIM(LTRIM(Val))) > 0
Но на самом деле вам не нужно проверять значение null, все, что вам нужно сделать, это проверить длину после обрезки значения.
SELECT *
FROM TableA
WHERE LEN(RTRIM(LTRIM(Val))) > 0
Этот выбор отсеивает нули, а также любые столбцы с пустым пространством.
Как оказалось, вам не нужно обрезать значение, потому что SQL Server игнорирует конечные пробелы, поэтому все, что вам действительно нужно, это: ВЫБРАТЬ * ОТ TableA ГДЕ LEN (Val)> 0
Вместо того, чтобы выполнять чрезмерные манипуляции со строками с LTRIM И RTRIM, просто найдите в выражении первое «непространство».
SELECT
*
FROM
[Table]
WHERE
COALESCE(PATINDEX('%[^ ]%', [Value]), 0) > 0
Обрезка необходима только при измерении вводимых значений, где пробелы не нужны. В противном случае len () все это перехватит.