【问题标题】:Separate with different characters sql用不同的字符分隔sql
【发布时间】:2021-11-09 15:37:34
【问题描述】:

所以我有一列包含多个不同的字符串。如果字符串包含 _,则必须在该字符上进行拆分。对于我使用的其他人,我会使用单独的规则,例如:如果它以 4FH、GWO、CTW 开头并且没有 _,那么它必须在 3 个字符后拆分。如果它以 4 开头并且没有 _.. 等。

Example

|Source    | 
|EC_HKT    |
|4FHHTK    |
|ABC_GJE   |
|4SHARED   |
|ETK_ETK-40|

etc..

我想要的结果是

|Source|Instance|
|EC    |HKT     |
|4FH   |HTK     |
|ABC   |GJE     |
|4     |SHARED  |
|ETK   |40      |

一开始我第一次尝试

SELECT
    LEFT(lr.Source, CHARINDEX('_',lr.Source)) AS Source,
    RIGHT(lr.Source, LEN(lr.Source) - CHARINDEX('_', lr.Source)) AS Interface,

但这只有在所有结果都有 _ 时才有效。任何提示或想法? CASE WHEN THEN 会起作用吗?

【问题讨论】:

  • 请解释一下你分割字符串的规则。不明显。
  • 我把它加进去了。
  • 这些是任意文本和规则,您几乎需要一个映射来执行此操作,因此几乎需要手动进行拆分。您可以使用简单的规则开始构建所述映射,但最终,这不会以简单的转换结束。 (例如,10SHARED 是映射到 10 和 SHARED 还是 1 和 0SHARED?ABC_ABC-GJE 是映射到 ABC 和 GJE 还是 ABC 和 ABC-GJE?为什么?
  • 这太武断了,无法应用任何常见的逻辑。我将创建一个函数来实现您的规则并计算要拆分的字符位置,然后您可以使用它将字符串分成两半。
  • 如果它以 4FH 开头,它也以 4 开头,那么你怎么知道是在 4 之后还是在 4FH 之后拆分?

标签: sql sql-server split delimiter


【解决方案1】:

这需要一点创造力,而且无疑比我在这里所做的工作要多,但是这至少为您提供了一种可以根据需要使用和增强的模式。

下面使用一个简单的函数从示例数据中应用基本规则来导出分割字符串的点,加上一些额外的字符删除和源部分的删除(如果它也存在于实例部分中)。

如果匹配多个“规则”,则使用匹配字符数较多的规则。

功能:

create or alter function splitpos(@string varchar(50))
returns table as
return
(
    with map as (
        select * from (values ('4FH'),('GWO'),('CTW'),('4'))m(v)
    )
    select IsNull(NullIf(CharIndex('_',@string),0)-1,Max(Len(m.v))) pos
    from map m
    where @string like m.v + '%'
)

查询:

select l.v source, Replace(Replace(Replace(Stuff(source,1,pos,''),'_',''),'-',''),l.v,'') instance
from t
cross apply dbo.splitpos(t.source)
cross apply (values(Left(source,pos)))l(v)

Demo DB<>Fiddle

【讨论】:

    【解决方案2】:

    要使用不同的规则进行拆分,请使用CASE 表达式。 (W3Schools)

    SELECT CASE 
        WHEN lr.Source LIKE '4FH%' AND CHARINDEX('_', lr.Source) = 0 
        THEN LEFT(lr.Source, 3)
        ...
     END as Source
    

    如果这些是单独的列,那么您需要为每列提供一个案例语句。

    【讨论】:

    • @jarlh 谢谢,我将其更改为与 Microsoft 匹配,而不是那么 f**lish
    • case statement 是用于条件执行代码的存储过程构造。 case expression 返回一个值,几乎可以在任何需要值的地方使用。全部符合 ANSI/ISO SQL 标准。
    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 2018-05-27
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2014-07-31
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多