Обрезать текст в скобках из столбцов, в которых он есть?

У меня есть столбец 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

Задавая вопрос, вы должны предоставить минимальный воспроизводимый пример: (1) DDL и выборочное заполнение данных, т. е. таблицы CREATE плюс операторы INSERT T-SQL. (2) Что вам нужно сделать, т. е. логика и ваш код попытаются реализовать ее в T-SQL. (3) Желаемый результат, основанный на примерных данных в # 1 выше. (4) Ваша версия SQL Server (SELECT @@version;).

Yitzhak Khabinsky 17.02.2023 21:12
dbfiddle показывает, как обрабатывать как простые, так и некоторые крайние случаи. Да, ваш вопрос сфокусирован. Ваша попытка решить проблему менее очевидна.
HABO 18.02.2023 04:43

@HABO: ваше решение для SANDFRAC4070 (1441)(316) неверно, потому что правило «значения столбца заканчиваются пробелом, за которым следует число в скобках». не в порядке, места нет

Luuk 18.02.2023 09:09

@Luuk Легко исправлено изменением одного символа: dbfiddle. Я также добавил несколько дополнительных тестовых примеров, показывающих, что он не работает с «числом», например. е. Я не копировал каждую строку, как это делал OP, чтобы определить, повторяются ли результаты.

HABO 18.02.2023 14:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
4
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Один из вариантов — 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

Спасибо, похоже, это работает. Делаем дополнительные тесты и проверяем, как это работает.

Jonathan Wood 17.02.2023 21:15

На всякий случай, если комментарий, в котором я разместил этот 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;

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

Я не говорил конкретно о них, потому что они не имели значения. Любое содержимое в конце текста, начинающееся с " (", должно быть обрезано.

Jonathan Wood 20.02.2023 22:30

@JonathanWood Так зачем включать в свой вопрос такой шум, как «число в скобках»?

HABO 20.02.2023 23:25

Другие вопросы по теме