Sql как найти пробелы

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's user avatar

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

Iain Samuel McLean Elder's user avatar

answered Jul 25, 2009 at 2:41

Joe's user avatar

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 Sansom's user avatar

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-K's user avatar

A-KA-K

16.7k8 gold badges52 silver badges71 bronze badges

1

The following worked for me:

PrdPicture LIKE '%'+char(160)+'%'

Martin Evans's user avatar

Martin Evans

45.4k17 gold badges79 silver badges94 bronze badges

answered Jul 6, 2017 at 6:23

Pratheeskumar's user avatar

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's user avatar

FallenAngel

17.9k15 gold badges82 silver badges113 bronze badges

answered Jul 25, 2009 at 9:03

gbn's user avatar

gbngbn

420k81 gold badges582 silver badges672 bronze badges

0

Use below query:

SELECT UniqueName 
FROM employee
WHERE employeeName LIKE '% %'

Prashant Pimpale's user avatar

answered Aug 23, 2018 at 15:53

pradeep's user avatar

select * from [sometable] where somecolumn like '% %'

FallenAngel's user avatar

FallenAngel

17.9k15 gold badges82 silver badges113 bronze badges

answered Jul 25, 2009 at 2:24

KellCOMnet's user avatar

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

Xanderak's user avatar

Как узнать есть ли пробелы в строке данных или строке запроса клиента через 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

Скриншоты:

TRUE - Пробелы есть в строке данных - PostgreSQL

TRUE — Пробелы есть в строке данных — PostgreSQL
FALSE - Пробелов нет в строке данных - PostgreSQL
FALSE — Пробелов нет в строке данных — PostgreSQL

Как удалить эту функцию?

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

Добавить комментарий