【问题标题】:String_Split on delimiter '.' SQL ServerString_Split 分隔符 '.' SQL 服务器
【发布时间】:2021-01-08 19:56:03
【问题描述】:

我在解析特定数据字段时遇到问题,我不知道如何解决它,所以我希望我能对如何解决它有所了解。

我有一个字段 [ItemCategory] ​​包含...的实例

  1. 实例:TennisShoes.Laces
  2. 实例:HikingBoot-Dr.Marten.Laces

(我无法将分隔符从“.”更改为“|”,因为我不控制源)

用于分离实例的代码如下:

SELECT 
[Program] = LTRIM(RTRIM(LEFT(c.[ItemCategory], CHARINDEX('.',c.[ItemCategory] + '.') - 1)))
,[Category] = LTRIM(RTRIM(RIGHT(c.[ItemCategory],LEN(c.[ItemCategory]) - CHARINDEX('.',c.[ItemCategory]))))

所以当 DHikingBoot-Dr.Marten.Laces 实例通过它变成的代码时我的问题。

[Program] = HikingBoot-Dr
[Category] = Marten.Laces

我怎样才能忽略第一个'。'并在第二个“.”上定界,同时仍保持第一个实例的正确性。

感谢您的宝贵时间。任何建议都会有所帮助。

【问题讨论】:

  • 什么版本的sql server?在所有数据中都是一致的吗?您最多有 3 个时段,如果是 3 个,则跳过第一个?还是总是以.Laces结尾?
  • 确定您正在使用的 sql server 的实际版本总是一个好主意。 TRIM 现在可以完成 LTRIM 和 RTRIM 的工作。

标签: sql sql-server tsql split


【解决方案1】:

试试这个来抢尽头。

RIGHT(c.[ItemCategory], CHARINDEX(REVERSE('.'), REVERSE(c.[ItemCategory])) -1)

【讨论】:

  • REVERSE('.') 有什么好处?
【解决方案2】:

如果可以的话,我建议重新审视您存储这些数据的方式,因为它存在缺陷并将继续给您带来挑战。

但除此之外,此解决方案假定“类别”不包含句点,并且数据将始终以 .category

结尾

对您开始的内容进行一些调整,我们将使用REVERSE() 在使用 LEFT() 时基本确定“类别”的长度。然后,当我们执行“编程”时,我们在使用 RIGHT() 时从总长度中减去它

DECLARE @testdata TABLE
(
    [sampledata] NVARCHAR(100)
);

INSERT INTO @testdata (
                          [sampledata]
                      )
VALUES ( N'TennisShoes.Laces' )
     , ( 'HikingBoot-Dr.Marten.Laces' );

SELECT LEFT([sampledata], LEN([sampledata]) - CHARINDEX('.', REVERSE([sampledata]))) AS [Program]
     ,RIGHT([sampledata], CHARINDEX('.', REVERSE([sampledata])) -1) AS [Category]
FROM   @testdata;

您还可以将SUBTRING()REVERSE() 一起使用

对于category,反转数据,找到第一个句号,解析 值并将其反转。

对于程序,反转数据,从第一个句点到末尾 并将其反转。

DECLARE @testdata TABLE
    (
        [sampledata] NVARCHAR(100)
    );

INSERT INTO @testdata (
                          [sampledata]
                      )
VALUES ( N'TennisShoes.Laces' )
     , ( 'HikingBoot-Dr.Marten.Laces' );

SELECT REVERSE(SUBSTRING(REVERSE([sampledata]), CHARINDEX('.', REVERSE([sampledata])) + 1, LEN([sampledata]))) AS [Program]
     , REVERSE(SUBSTRING(REVERSE([sampledata]), 1, CHARINDEX('.', REVERSE([sampledata])) - 1)) AS [Category]
FROM   @testdata;

两者都给你结果:

Program               Category
--------------------- ----------
TennisShoes           Laces
HikingBoot-Dr.Marten  Laces

【讨论】:

  • 感谢您的帮助!
【解决方案3】:

如果您只需要选择. 之后的最后一部分,那么您可以反转字符串,找到charindex 并在该位置执行leftright

with s as (
  select 'TennisShoes.Laces' as inst union
  select 'HikingBoot-Dr.Marten.Laces' union
  select 'Test'
)
, pos as (
  select
    s.*,
    charindex('.', reverse(inst)) as pos
  from s
)
select
  ltrim(rtrim(left(inst, len(inst) - pos))) as program,
  ltrim(rtrim(right(inst, nullif(pos - 1, -1)))) as category
from pos

program              | category
:------------------- | :-------
HikingBoot-Dr.Marten | Laces   
TennisShoes          | Laces   
Test                 | null

db<>fiddle

【讨论】:

  • 谢谢,这很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多