【问题标题】:T-SQL Extract string between two known charactersT-SQL 提取两个已知字符之间的字符串
【发布时间】:2020-11-05 04:02:37
【问题描述】:

我正在使用 MS SQL Server 2014。我有一个包含字符串(分配给字段 CAR)的表,如下所示:

ORANGE 1 FORD FIESTA;PETROL
RED 24 FORD MUSTANG; PETROL
BLACK 2 NISSAN JUKE; DIESEL

但是,我需要提取从第二个空格 ' ' 到第一个分号的所有内容;如下所示:

FORD FIESTA
FORD MUSTANG
NISSAN JUKE

这是我的 SQL:

SELECT SUBSTRING(CAR, CHARINDEX(' ', CAR) , CHARINDEX(';',CAR) - CHARINDEX(' ', CAR) + Len(';'))
FROM tblStock;

但是,这给了我以下信息:

 1 FORD FIESTA;
24 FORD MUSTANG;
2 NISSAN JUKE;

我哪里错了?

【问题讨论】:

  • 您应该在将数据 存储到数据库之前对其进行清理。在文本处理方面,一般的 SQL 和特别是 T-SQL 是非常弱的。用于查询、过滤的数据应存储在单独的列中。如果您有只是偶尔使用的数据,您可以将其存储为 JSON 或 XML,并使用例如 JSON_VALUE 来提取特定字段
  • @PanagiotisKanavos 很欣赏你所说的,但这是来自第 3 方系统,我无法控制,只能从 执行只读选择

标签: sql-server string tsql substring


【解决方案1】:

您正在选择从第一个空格到第一个分号的所有内容。

您可以选择从“第一个分号”到第一个“空格后跟一个数字”的反转字符串(假设每条记录都有数字),然后最后反转返回的字符串。

SELECT reverse(trim(substring(reverse(car), charindex(';', reverse(car), 1)+1, 
                 PATINDEX('% [0-9]%', REVERSE(car)) - charindex(';', reverse(car), 1)))) Final

请找到 dbfiddle here

【讨论】:

  • 谢谢,但 SQL Server 2014 中没有现成的 TRIM
  • @Michael 您可以将其替换为 LTRIM、RTRIM。
【解决方案2】:

只是另一种选择

示例

Declare @YourTable Table ([Car] varchar(50))
Insert Into @YourTable Values 
 ('ORANGE 1 FORD FIESTA;PETROL')
,('RED 24 FORD MUSTANG; PETROL')
,('BLACK 2 NISSAN JUKE; DIESEL')
 
Select A.*
      ,NewValue = stuff(left(Car,charindex(';',Car+';')-1),1,patindex('%[0-9] %',Car+'0'),'')
 From  @YourTable A

退货

Car                            NewValue
ORANGE 1 FORD FIESTA;PETROL    FORD FIESTA
RED 24 FORD MUSTANG; PETROL    FORD MUSTANG
BLACK 2 NISSAN JUKE; DIESEL    NISSAN JUKE

【讨论】:

  • 在“任何数字后跟一个空格”之前很好地使用东西来填充任何内容。
  • @sacse 谢谢你的笑容 :)
  • 谢谢你,我已经接受了你的解决方案
猜你喜欢
  • 2020-11-13
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多