英文:
Trim off parenthesized text from columns that have it?
问题
我有一个 NVARCHAR(80)
列。一些列的值以空格结尾,后跟括号内的数字。 (如下所示。)
是否有SQL Server的语法可以删除具有这些值的空格、括号和数字,但保留所有其他值不变?
例如,"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
英文:
I have an NVARCHAR(80)
column. Some column values end with a space, followed by a number within parentheses. (As shown below.)
Is there a SQL-Server syntax to remove the space, parentheses, and number from values that have them, but leave all other values unchanged?
For example, "SANDFRAC4070 (1441316)"
would become "SANDFRAC4070"
, and "SAND FRACING 30 50 MESH"
would be unchanged.
Sample Data
<!-- language: lang-none -->
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
得分: 4
一种选项是使用 charindex()
和一个 "Fail-Safe"。
示例
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
英文:
One option is charindex()
with a "Fail-Safe"
Example
Declare @YourTable Table ([SomeCol] varchar(50)) Insert Into @YourTable Values
('SANDFRAC4070 (1441316)')
,('SANDFRAC3050MES')
Select *
,left(SomeCol,charindex(' (',SomeCol+' (')-1)
From @YourTable
Results
SomeCol (No column name)
SANDFRAC4070 (1441316) SANDFRAC4070
SANDFRAC3050MES SANDFRAC3050MES
答案2
得分: 1
以下是翻译好的部分:
只是以防我发布此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,
-- 通过从字符串末尾向后搜索找到最后一个开括号。
Len( Sample ) - CharIndex( '( ', Reverse( Sample ) ) as LastOpenParen
from @Samples ),
Step2 as (
select Sample, LastOpenParen,
case
-- 如果没有开括号,或者没有字符串,那么我们就完成了。
when LastOpenParen = Len( Sample ) or LastOpenParen is NULL then NULL
-- 目标子字符串从最后一个开括号到字符串末尾。
else Substring( Sample, LastOpenParen + 1, 80 ) end as Target
from Step1 )
select Sample, Len( Sample ) as Length, LastOpenParen,
case
-- 没有有趣的内容。
when Target is NULL then Sample
-- 括号中的字符串,但包括非数字字符。
when Target like '(%[^0-9]%)' then Sample
-- 括号中的字符串至少有一个数字且没有非数字字符。
when Target like '(%[0-9]%)' then RTrim( Left( Sample, LastOpenParen ) )
-- 空括号。
else Sample end as CorrectedSample
from Step2;
注意,并不是每个可能被视为“数字”的值都被处理,因为提问者对于小数、负数、科学表示法等值表达方式的描述相当模糊。
英文:
Just in case the comment in which I posted this dbfiddle disappears I'll move it to an answer:
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;
Note that not every value that might be considered a number is handled as the OP was rather vague about decimal, negative, scientific, ... values.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论