sql server-как найти строки с пробелами в столбце

Я хочу сделать что-то вроде

select * from X where string.IsNullOrWhiteSpace(a)

столбец a является NOT NULL

Итак, что было бы эквивалентом C# string.IsNullOrWhiteSpace в T-SQL, чтобы получить все строки, где столбец a имеет только пробелы (сочетание нескольких пробелов или вкладок)?

кроме того, я бы предпочел избежать использования clr функции.

6 ответов


вы можете попробовать это:

select * 
from yourtable
where ltrim(rtrim(yourcolumn)) = ''

идея в том, что если обрезка значения оставляет вас с пустой строкой, то все, что у вас было в первую очередь, это пробелы.

вы также можете просто сделать это:

select *
from yourtable
where yourcolumn like ' '

обратите внимание, что я протестировал второй запрос на SQL Server 2008 R2, и он не работает в 2014 году, как указано в комментариях @gunr2171

наконец, если у вас есть табуляции, возврата каретки или перевода строки, выше не получится. Что ты можешь сделать? сначала нужно заменить эти значения пустой строкой, а затем использовать первый запрос следующим образом:

select * 
from yourtable
where ltrim(rtrim(replace(replace(replace(yourcolumn,char(9),''),char(10),''),char(13),''))) = ''

char(9),char(10) и char(13) использованы для платы, линии питания и возвращения экипажа соответственно.


на основе shree.комментарий ТРГ-18, вот возможный ответ...

select * 
from yourtable
where ltrim(rtrim(yourcolumn)) = '' or yourcolumn is null

Я думаю, что это должно сделать трюк


У меня просто была проблема с этой конкретной ситуацией, мне нужно было найти и очистить каждое поле с пробелами, но я нашел 4 типа возможных пробелов в моих полях базы данных (ссылка на таблица кодов ASCII):

  • горизонтальная вкладка(char (9))
  • новая строка(char (10))
  • вертикальная вкладка(char (9))
  • пробел(char (32))

возможно, этот запрос может вам помочь.

SELECT @COLUMN
FROM @TABLE
WHERE @COLUMN like '%'+CHAR(9)+'%' or @COLUMN like '%'+CHAR(10)+'%'
or @COLUMN like '%'+CHAR(11)+'%' or @COLUMN like '%'+CHAR(32)+'%'

Я бы попробовал что-то вроде этого

select *
from x
where len(ltrim(rtrim(coalesce(a,'')))) = 0

после изучения моего запроса было бы излишним использовать ltrim и rtrim, просто используйте один или другой.

следующая хватит

select *
from x
where len(ltrim(coalesce(a,''))) = 0

для полных пробелов ASCII (вкладки, каналы строк, пробелы и т. д.) и гибкость добавления других символов по мере необходимости, i.E CHAR (0):

WITH
  num256 AS (
     SELECT TOP 256 ROW_NUMBER() OVER(ORDER BY (SELECT 1)) n
     FROM master.dbo.spt_values
  ),
  filter AS (
    SELECT CHAR(n-1) c FROM num256
    WHERE n NOT IN (0x09,0x0A,0x0B,0x0C,0x0D,0x20,0x85,0xA0)
  )
SELECT MyColumn
FROM MyTable
WHERE NOT EXISTS(
  SELECT 1
  FROM filter
  WHERE MyColumn LIKE '%'+c+'%'
)

вот пример оператора If, который проверяет, является ли переменная нулевой или пробелом (эквивалент c#IsNullOrWhitespace).

declare @temp nvarchar(max) = '      ';

if(@temp is null
    or
   LEN(LTRIM(RTRIM(@temp))) = 0)
begin
    print 'it is empty or null'
end

вы можете сделать это встроенным, включив логику в предложение where.

select *
from someTable
where
    aValue is null
        or
    LEN(LTRIM(RTRIM(aValue))) = 0