У меня есть столбец NVARCHAR(80)
. Некоторые значения столбца заканчиваются пробелом, за которым следует число в круглых скобках. (Как показано ниже.)
Существует ли синтаксис SQL-сервера для удаления пробелов, круглых скобок и чисел из значений, в которых они есть, но оставления всех остальных значений без изменений?
Например, "SANDFRAC4070 (1441316)"
станет "SANDFRAC4070"
, а "SAND FRACING 30 50 MESH"
не изменится.
Образец данных
SAND FRACING 100 MESH (1441317)
SAND FRACING 100 MESH (1441317)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC4070 (1441316)
SANDFRAC3050MES
SANDFRAC3050MES
SANDFRAC3050MES
SANDFRAC3050MES
SANDFRAC4070MES
SANDFRAC4070MES
SANDFRAC4070MES
SANDFRAC4070MES
SANDFRAC4070MES
SANDFRAC4070MES
SANDFRAC4070MES
SAND FRACING 30 50 MESH
SAND FRACING 30 50 MESH
@HABO: ваше решение для SANDFRAC4070 (1441)(316)
неверно, потому что правило «значения столбца заканчиваются пробелом, за которым следует число в скобках». не в порядке, места нет
@Luuk Легко исправлено изменением одного символа: dbfiddle. Я также добавил несколько дополнительных тестовых примеров, показывающих, что он не работает с «числом», например. е. Я не копировал каждую строку, как это делал OP, чтобы определить, повторяются ли результаты.
Один из вариантов — charindex()
с «отказоустойчивостью».
Пример
Declare @YourTable Table ([SomeCol] varchar(50)) Insert Into @YourTable Values
('SANDFRAC4070 (1441316)')
,('SANDFRAC3050MES')
Select *
,left(SomeCol,charindex(' (',SomeCol+' (')-1)
From @YourTable
Полученные результаты
SomeCol (No column name)
SANDFRAC4070 (1441316) SANDFRAC4070
SANDFRAC3050MES SANDFRAC3050MES
Спасибо, похоже, это работает. Делаем дополнительные тесты и проверяем, как это работает.
На всякий случай, если комментарий, в котором я разместил этот dbfiddle, исчезнет, я перенесу его в ответ:
declare @Samples as Table ( Sample VarChar(80) );
insert into @Samples ( Sample ) values
( 'SAND FRACING 100 MESH (1441317)' ),
( 'SANDFRAC4070 (1441316)' ),
( 'SANDFRAC4070(1441316)' ),
( 'SANDFRAC3050MES' ),
( 'SAND FRACING 30 50 MESH' ),
( 'SAND FRACING (30) 50 MESH' ),
( 'SAND FRACING (30) (50) MESH' ),
( 'SANDFRAC4070 (1441)(316)' ),
( 'SANDFRAC4070 (1441) (316)' ),
( 'SANDWICH CHICKEN (NO ONION)' ),
( 'SAND ()' ),
( 'SAND (0)' ),
( 'SAND (-0)' ),
( 'SAND (6.022E+23)' ),
( 'SAND (e)' ),
( '' ),
( NULL );
with
Step1 as (
select Sample,
-- Find the last open parenthesis by searching backwards from the end of the string.
Len( Sample ) - CharIndex( '( ', Reverse( Sample ) ) as LastOpenParen
from @Samples ),
Step2 as (
select Sample, LastOpenParen,
case
-- If there was no open parenthesis, or no string, then we're done.
when LastOpenParen = Len( Sample ) or LastOpenParen is NULL then NULL
-- The target substring runs from the last open parenthesis to the end of the string.
else Substring( Sample, LastOpenParen + 1, 80 ) end as Target
from Step1 )
select Sample, Len( Sample ) as Length, LastOpenParen,
case
-- Nothing interesting.
when Target is NULL then Sample
-- A string in parentheses, but including a non-digit character.
when Target like '(%[^0-9]%)' then Sample
-- A string in parentheses with at least one digit and no non-digits.
when Target like '(%[0-9]%)' then RTrim( Left( Sample, LastOpenParen ) )
-- Empty parenteses.
else Sample end as CorrectedSample
from Step2;
Обратите внимание, что не каждое значение, которое можно считать числом, обрабатывается, поскольку ОП довольно расплывчато относился к десятичным, отрицательным, научным, ... значениям.
Я не говорил конкретно о них, потому что они не имели значения. Любое содержимое в конце текста, начинающееся с " (", должно быть обрезано.
@JonathanWood Так зачем включать в свой вопрос такой шум, как «число в скобках»?
Задавая вопрос, вы должны предоставить минимальный воспроизводимый пример: (1) DDL и выборочное заполнение данных, т. е. таблицы CREATE плюс операторы INSERT T-SQL. (2) Что вам нужно сделать, т. е. логика и ваш код попытаются реализовать ее в T-SQL. (3) Желаемый результат, основанный на примерных данных в # 1 выше. (4) Ваша версия SQL Server (SELECT @@version;).