-2

我有以下几种情况,谁能告诉我如何删除 C 或 -1C 或 -2C 等。

我以不同的方式获取数据

Examples:  test1C : To extract as test1

           test1-1C :to extract as test1

           test1-2C : to extract as test1.
           testC1C : to extract as testC1
           testCC: to extract as testC

我尝试了 substr 和 instr 函数,但无法竖起大拇指。在上面的例子中,预期的数据并不总是长度为“5”。数据会有所不同,但有时数据会附加“C”或“-1C”或“-2C”。

问候,

柴兔

4

6 回答 6

1

只是

regexp_replace(str, '-[^-]*|C$', '')

例如

SQL> with data as (select 'test1C' str, 'test1' expected from dual
  2                union all
  3                select 'test1-1C', 'test1' from dual
  4                union all
  5                select 'test1-2C', 'test1' from dual
  6                union all
  7                select 'testC1C', 'testC1' from dual
  8                union all
  9                select 'testCC', 'testC' from dual)
 10  select str, expected, regexp_replace(str, '-[^-]*|C$', '') actual
 11  from data;

STR      EXPECT ACTUAL
-------- ------ ----------
test1C   test1  test1
test1-1C test1  test1
test1-2C test1  test1
testC1C  testC1 testC1
testCC   testC  testC

SQL>
于 2012-12-10T21:24:03.627 回答
0
  1. select replace(column_name, 'C', '') from table_name - 这在 sybase 中工作正常
  2. select replace ((select replace(column_name, '-', '') from table_name), C,'')
  3. select replace((select replace(column_name, '-', '') from table_name), C,'')
于 2012-12-10T18:57:33.203 回答
0

如果您只是想提取前 5 个字符,那么 Substr 应该可以正常工作。即以上所有内容的 SUBSTR(Column_Name,1,5) 将为您提供“test1”。我错过了什么吗?

于 2012-12-10T18:57:33.807 回答
0

为什么不只取前 5 个字符?

left(val, 5)

让我猜测规则是:如果有连字符,则连字符之前的所有内容;如果有“C”,则表示“C”之前的所有内容;否则所有内容:

left(val, (case when locate('-', val) > 0 then locate('-', val) - 1
                when locate('C', val) > 0 then length(val) - locate('C', reverse(val)) - 1
                else length(val)
            end))

这是否适用于区分大小写 c 可能取决于您的整理顺序。

于 2012-12-10T19:01:32.363 回答
0

一种解决方案是创建临时表,将所有数据转储到其中。然后使用更新函数更新那里的值。步骤如下

  1. 创建临时表
  2. 将数据写入临时表
  3. 更新临时表。根据需要更新列值。
于 2012-12-10T19:06:35.493 回答
0

这个查询呢?

select substring_index(substring_index('test1-2C', 'C', 1), '-', 1)

功能:

create function mytrim(p_text varchar(100))
returns varchar(100)
begin
  set @text = reverse(p_text);
  set @l = locate('-', @text);
  if @l > 0 then
    return reverse(substring(@text, @l + 1));
  elseif locate('C', @text) > 0 then
    return reverse(substring(@text, 2));
  else
    return p_text;
  end if;
end
于 2012-12-10T19:07:40.910 回答