删除字符串列中的破折号

时间:2020-06-10 19:03:02

标签: sql sql-server tsql stored-procedures

在存储过程中,我有此字段

LTRIM(ISNULL(O.Column1, ''))

如果值的末尾有破折号(-),请删除它。仅在开始/结束处存在破折号的情况下。

任何建议

编辑:

Microsoft SQL Server 2014 12.0.5546.0

预期输出:

1)input: "abc-abc" //output: "abc-abc"

2)input: "abc-" //output: "abc"

3)input: "abc" //ouput: "abc"

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我认为您可能在这里被字符串处理所困扰。

此处的CASE表达式从您的列中获取LTRIM/RTRIM的结果,并在两端检查一个破折号,然后在两端检查一个破折号。如果存在破折号,则会将其删除。它不是很漂亮,并且在大量数据上表现不佳,但是可以满足您的需求。

数据设置:

create table trim (col1 varchar(10));

insert trim (col1)
values
  ('abc'),
  (' abc-'),
  ('abc- '),
  ('abc-abc '),
  (' -abc'),
  ('-abc '),
  (NULL),
  (''),
  (' -abc- ');

查询:

select 
 case 
    when right(ltrim(rtrim(isnull(col1,''))),1) = '-'
     and left(ltrim(rtrim(isnull(col1,''))),1) = '-'
      then substring(ltrim(rtrim(isnull(col1,''))),2,len(ltrim(rtrim(isnull(col1,''))))-2)
    when right(ltrim(rtrim(isnull(col1,''))),1) = '-'
      then left(ltrim(rtrim(isnull(col1,''))), len(ltrim(rtrim(isnull(col1,''))))-1)
    when left(ltrim(rtrim(isnull(col1,''))),1) = '-'
      then right(ltrim(rtrim(isnull(col1,''))), len(ltrim(rtrim(isnull(col1,''))))-1)
    else ltrim(rtrim(isnull(col1,'')))
  end as trimmed
from trim;

结果:


+---------+
| trimmed |
+---------+
| abc     |
| abc     |
| abc     |
| abc-abc |
| abc     |
| abc     |
|         |
|         |
| abc     |
+---------+

SQL Fiddle Demo

答案 2 :(得分:0)

您可以将LEFT函数和SUBSTRING一起使用以实现结果。

SELECT CASE WHEN RIGHT(stringVal,1)= '-' THEN SUBSTRING(stringVal,1,LEN(stringVal)-1) 
ELSE stringVal END AS ModifiedString 
from
( VALUES ('abc-abc'), ('abc-'),('abc')) as t(stringVal)
+----------------+
| ModifiedString |
+----------------+
| abc-abc        |
| abc            |
| abc            |
+----------------+