【问题标题】:sql-remove dashes from string columnsql-从字符串列中删除破折号
【发布时间】:2020-06-10 19:03:02
【问题描述】:

在存储过程中,我有这个字段

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"

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。此外,样本数据和期望的结果也会有所帮助。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

我认为您可能会在这里遇到字符串操作问题。

这里的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

【讨论】:

  • 为什么 T-SQL 中的字符串操作如此受欢迎 user-hostile?几十年来一直如此。我们甚至还没有真正的正则表达式支持或列表达式中的中间变量,并且对内联标量 UDF 的支持很挑剔。感觉就像一个被诅咒的地方
  • @Dai,我退休之间大约有 10 年的时间,所以只要他们再对用户保持敌意十年,我就会接受这份工作保障。 :)
【解决方案2】:
【解决方案3】:

您可以使用 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            |
+----------------+

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2022-01-15
    • 2017-11-12
    • 2019-01-14
    相关资源
    最近更新 更多