TSQL – how to find if a column has a space char(32)
?
select *
from [sometable]
where CHARINDEX(' ', [somecolumn]) > 0
doesn’t work? Any ideas?
FallenAngel
17.9k15 gold badges82 silver badges113 bronze badges
asked Jul 25, 2009 at 2:22
2
You have to rtrim CHAR columns.
CHAR columns are padded with spaces on the right up to the maximum length.
RTRIM helps to avoid false positives when storing strings that are shorter than the maximum length.
select * from [table] where rtrim(col) like '% %'
create table dropme
(foo char(32))
insert into dropme values('nospaces')
insert into dropme values('i have a space')
insert into dropme values('space bar')
select replace(foo,' ','|') from dropme
where foo like '% %'
nospaces
i|have|a|space
space|bar
select replace(foo,' ','|') from dropme
where rtrim(foo) like '% %'
i|have|a|space
space|bar
answered Jul 25, 2009 at 2:41
JoeJoe
41.2k19 gold badges104 silver badges125 bronze badges
2
The following example should illustrate how you can achieve this.
create table #tableTest
(
someData varchar(100) not null
);
insert into #tableTest(someData) values('dsadsa');
insert into #tableTest(someData) values('fdssf 432423');
insert into #tableTest(someData) values('432423fsdv');
insert into #tableTest(someData) values('321 jhlhkj 543');
select *
from #tableTest;
select *
from #tableTest
where charindex(char(32),someData) > 0;
drop table #tableTest;
answered Jul 25, 2009 at 6:25
John SansomJohn Sansom
40.8k9 gold badges72 silver badges84 bronze badges
What do you mean by “doesn’t work”? Both ways work for me:
SELECT ''''+a+'''' FROM(
SELECT 'asd fgh' AS a UNION ALL
SELECT ' fgh' AS a UNION ALL
SELECT 'asd ' AS a UNION ALL
SELECT 'asfdg') As t
WHERE a LIKE '% %'
---------
'asd fgh'
' fgh'
'asd '
SELECT ''''+a+'''' FROM(
SELECT 'asd fgh' AS a UNION ALL
SELECT ' fgh' AS a UNION ALL
SELECT 'asd ' AS a UNION ALL
SELECT 'asfdg') As t
WHERE CHARINDEX(' ', a) > 0
---------
'asd fgh'
' fgh'
'asd '
answered Jul 25, 2009 at 2:39
A-KA-K
16.7k8 gold badges52 silver badges71 bronze badges
1
The following worked for me:
PrdPicture LIKE '%'+char(160)+'%'
Martin Evans
45.4k17 gold badges79 silver badges94 bronze badges
answered Jul 6, 2017 at 6:23
PratheeskumarPratheeskumar
4031 gold badge4 silver badges8 bronze badges
Given you’ve not really explained what the problem is…
Are you looking for hardspace (nbsp)
, CHAR(160)
? Or tab CHAR(9)
?
These can look like spaces but aren’t
FallenAngel
17.9k15 gold badges82 silver badges113 bronze badges
answered Jul 25, 2009 at 9:03
gbngbn
420k81 gold badges582 silver badges672 bronze badges
0
Use below query:
SELECT UniqueName
FROM employee
WHERE employeeName LIKE '% %'
answered Aug 23, 2018 at 15:53
select * from [sometable] where somecolumn like '% %'
FallenAngel
17.9k15 gold badges82 silver badges113 bronze badges
answered Jul 25, 2009 at 2:24
KellCOMnetKellCOMnet
1,8393 gold badges16 silver badges27 bronze badges
3
I had the exact same question as worded, though I was looking to see if the column had a space vs being null. This worked for me:
SELECT UniqueName
FROM employee
WHERE ascii(employeeName) = 32
The intuitive query doesn’t work; below returns all null rows as well:
SELECT UniqueName
FROM employee
WHERE employeeName = ' '
answered Apr 30, 2020 at 8:58
Как узнать есть ли пробелы в строке данных или строке запроса клиента через PostgreSQL?
Мы напишем функцию g4. У нас схема называется test1. Внутри тела функции будет производиться сопоставление на наличие пробелов. Проще всего это делать регулярными выражениями, которые работают практически во всех языках программирования одинаково.
Эта функция будет возвращать логическое значение TRUE или FALSE если встретит пробел в строке.
-- Добавляем язык 'plpgsql' -- Добавляем СТАРТ (BEGIN) и ФИНИШ (END) CREATE OR REPLACE FUNCTION test1.g4(str text) RETURNS boolean LANGUAGE 'plpgsql' AS $BODY$ BEGIN RETURN str ~ ' '; END; $BODY$;
Символ тильды «~» означает, что шаблон регулярного выражения будет учитывать регистр символов в строке.
У классического клавиатурного пробела нет понятия регистра, поэтому можно использовать два варианта написани:
SELECT 'bla bla' ~ ' '; или SELECT 'bla bla' ~* ' ';
Пример работы функции
SELECT test1.g4('bla bla bla'); -- true SELECT test1.g4('ffgghh'); -- false
Скриншоты:
Как удалить эту функцию?
DROP FUNCTION test1.g4(str text);
Зачем мы проверяем на наличие пробелов в строке?
Почти всегда требуется проверка корректности вводимых данных. Таблицы в PostgreSQL устроены таким образом, что определённый столбец ожидает определённый тип данных и никак иначе. Если мы говорим, что в столбце А храним URL-адреса, то нам не нужны строки с рецептами клубничного варенья. URL-адреса имеют характерный индивидуальный синтаксис, который можно легко отличить от других данных. Один из признаков URL — отсутствие символов пробела.
Задача функций — проверять валидность (корректность) данных перед остальными операциями CRUD (Create, Read, Update, Delete).
Информационные ссылки
PostgreSQL | Проверка содержимого строки перед вставкой в таблицу по условию
Сайт СУБД PostgreSQL — https://www.postgresql.org
Команды SQL — https://postgrespro.ru/docs/postgresql/14/sql-commands
Команда CREATE FUNCTION — https://postgrespro.ru/docs/postgresql/14/sql-createfunction
Команда SELECT — https://postgrespro.ru/docs/postgresql/14/sql-select
Раздел «9.4. Строковые функции и операторы» — https://postgrespro.ru/docs/postgresql/14/functions-string
Раздел «9.7.3. Регулярные выражения POSIX» — https://postgrespro.ru/docs/postgresql/14/functions-matching#FUNCTIONS-POSIX-REGEXP
Раздел «43.6. Управляющие структуры» — https://postgrespro.ru/docs/postgresql/14/plpgsql-control-structures
Графический интерфейс pgAdmin — https://www.pgadmin.org
Я нашел принятый ответ немного медленнее:
SELECT col FROM tbl WHERE col LIKE '% ';
против этой техники:
SELECT col FROM tbl WHERE ASCII(RIGHT([value], 1)) = 32;
Идея состоит в том, чтобы получить последний символ, но сравнить его ASCII
код с ASCII
код пробела вместо этого только с ' '
(Космос). Если мы будем использовать только ' '
пробел, пустая строка даст истину:
DECLARE @EmptyString NVARCHAR(12) = '';
SELECT IIF(RIGHT(@EmptyString, 1) = ' ', 1, 0); -- this returns 1
Вышесказанное связано с тем, что Microsoft реализация сравнения строк.
Итак, как быстро?
Вы можете попробовать следующий код:
CREATE TABLE #DataSource
(
[RowID] INT PRIMARY KEY IDENTITY(1,1)
,[value] NVARCHAR(1024)
);
INSERT INTO #DataSource ([value])
SELECT TOP (1000000) 'text ' + CAST(ROW_NUMBER() OVER(ORDER BY t1.number) AS VARCHAR(12))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
UPDATE #DataSource
SET [value] = [value] + ' '
WHERE [RowID] = 100000;
SELECT *
FROM #DataSource
WHERE ASCII(RIGHT([value], 1)) = 32;
SELECT *
FROM #DataSource
WHERE [value] LIKE '% ';
На моей машине разница составляет около 1 секунды:
Я тестировал его на таблице с 600 тыс. Строк, но большего размера, а разница была более 8 секунд. Итак, насколько быстро будет зависеть от данных вашего реального дела.
Вы можете попробовать следующее:
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)
используются для отображения табуляции, строки и возврата каретки соответственно.
Вопрос:
Я хочу сделать что-то вроде
select * from X where string.IsNullOrWhiteSpace(a)
Столбец a NOT NULL
Итак, что было бы эквивалентно С# string.IsNullOrWhiteSpace
в T-SQL, чтобы получить все строки, где столбец a имеет только пробелы (комбинация нескольких пробелов или вкладок)?
Кроме того, я бы предпочел не использовать clr.
Лучший ответ:
Вы можете попробовать следующее:
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)
используются для отображения табуляции, строки и возврата каретки соответственно.
Ответ №1
На основе комментария shree.pat18, вот возможный ответ…
select *
from yourtable
where ltrim(rtrim(yourcolumn)) = '' or yourcolumn is null
Я думаю, что это должно было сделать трюк
Ответ №2
Я бы попробовал что-то вроде этого
select *
from x
where len(ltrim(rtrim(coalesce(a,'')))) = 0
После изучения моего запроса было бы излишним использовать ltrim AND rtrim, просто используйте тот или иной.
достаточно будет
select *
from x
where len(ltrim(coalesce(a,''))) = 0
Ответ №3
Для полного пробела ASCII (вкладки, строки, пробелы и т.д.) и гибкости для добавления других символов по мере необходимости, т.е. 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+'%'
)
Ответ №4
У меня просто была проблема с этой конкретной ситуацией, мне нужно было найти и очистить каждое поле с пробелами, но я обнаружил 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)+'%'
Ответ №5
Вот пример инструкции If, которая проверяет, является ли переменная нулевой или пробельной (С# эквивалент IsNullOrWhitespace
).
declare @temp nvarchar(max) = ' ';
if(@temp is null
or
LEN(LTRIM(RTRIM(@temp))) = 0)
begin
print 'it is empty or null'
end
Вы можете сделать это inline, включив логику в предложение where.
select *
from someTable
where
aValue is null
or
LEN(LTRIM(RTRIM(aValue))) = 0