Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:如何在查询中使用子字符串?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL Server:如何在查询中使用子字符串?

SQL Server:如何在查询中使用子字符串?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有这样的争吵: 我该怎么做 如何在“选择”操作中使用此选项 更新: 我想找到第一个和最后一个“[”””,只捕捉里面的东西 例如: 声音:英文版[钴爪] 返回 钴爪 致以最良好的祝愿, Valter Henrique。听起来您需要一个正则表达式,以便从源字符串中获取所需的数据 select substring(field, charindex('[', field) + 1, charindex(']', field) - charindex('[', field) - 1) 获取第一个[和

我有这样的争吵:

我该怎么做

如何在“选择”操作中使用此选项

更新: 我想找到第一个和最后一个“[”””,只捕捉里面的东西

例如:

声音:英文版[钴爪]

返回

钴爪

致以最良好的祝愿,
Valter Henrique。

听起来您需要一个正则表达式,以便从源字符串中获取所需的数据

select substring(field, charindex('[', field) + 1, charindex(']', field) - charindex('[', field) - 1)


获取第一个
[
和下一个
]
之间的文本

-- cte for test data
;with actor_character(character) AS
(
  select 'voice: English version) [Cobalt Claw]' union all
  select 'voice: English version) [Cobalt Claw' union all
  select 'voice: English version)  Cobalt Claw]' union all
  select 'voice: English version) ]Cobalt Claw[' union all
  select 'voice: English version)  Cobalt Claw'
)
select *,
  case
    -- Test for not valid positions
    when Start.Pos = 1 or Stop.Pos = 0
    then character
    else substring(character, Start.Pos, Stop.Pos-Start.Pos)
  end
from actor_character
  cross apply (select charindex('[', character)+1) as Start(Pos)
  cross apply (select charindex(']', character, Start.Pos)) as Stop(Pos)
-- cte for test data
;with actor_character(character) AS
(
  select 'voice: English version) [Cobalt Claw]' union all
  select 'voice: English version) [Cobalt Claw' union all
  select 'voice: English version)  Cobalt Claw]' union all
  select 'voice: English version) ]Cobalt Claw[' union all
  select 'voice: English version) [Cobalt]Claw]' union all
  select 'voice: English version)  Cobalt Claw'
)
select *,
  case
    -- Test for not valid positions
    when Start.Pos = 0 or Stop.Pos = 0 or Start.Pos > len(character)-Stop.Pos
    then character
    else substring(character, Start.Pos+1, len(character)-Stop.Pos-Start.Pos)
  end

from actor_character
  cross apply (select charindex('[', character)) as Start(Pos)
  cross apply (select charindex(']', reverse(character))) as Stop(Pos)

获取第一个
[
和最后一个
]
之间的文本

-- cte for test data
;with actor_character(character) AS
(
  select 'voice: English version) [Cobalt Claw]' union all
  select 'voice: English version) [Cobalt Claw' union all
  select 'voice: English version)  Cobalt Claw]' union all
  select 'voice: English version) ]Cobalt Claw[' union all
  select 'voice: English version)  Cobalt Claw'
)
select *,
  case
    -- Test for not valid positions
    when Start.Pos = 1 or Stop.Pos = 0
    then character
    else substring(character, Start.Pos, Stop.Pos-Start.Pos)
  end
from actor_character
  cross apply (select charindex('[', character)+1) as Start(Pos)
  cross apply (select charindex(']', character, Start.Pos)) as Stop(Pos)
-- cte for test data
;with actor_character(character) AS
(
  select 'voice: English version) [Cobalt Claw]' union all
  select 'voice: English version) [Cobalt Claw' union all
  select 'voice: English version)  Cobalt Claw]' union all
  select 'voice: English version) ]Cobalt Claw[' union all
  select 'voice: English version) [Cobalt]Claw]' union all
  select 'voice: English version)  Cobalt Claw'
)
select *,
  case
    -- Test for not valid positions
    when Start.Pos = 0 or Stop.Pos = 0 or Start.Pos > len(character)-Stop.Pos
    then character
    else substring(character, Start.Pos+1, len(character)-Stop.Pos-Start.Pos)
  end

from actor_character
  cross apply (select charindex('[', character)) as Start(Pos)
  cross apply (select charindex(']', reverse(character))) as Stop(Pos)

@squawknull这是与行一起出现的,数据库不是我的。我明白了。所以它是字符串的一部分。我将修改我的查询。我尝试您推荐的方法,但现在我的情况是:选择前(50)个子字符串(character,charrendex('[',character)+1,charrendex(']',character)-charrendex('[',character)-1)FROM actor_characterreturns:传递给LEFT或SUBSTRING函数的长度参数无效。严重性16状态2是否每一行都有“[”和“]”字符?很好:如何更新此参数以找到最后的“]”(请参阅问题中的更新)?@Jon–添加了使用last
]
的版本。我是否能够在查询中获取一列,并在同一select语句中获取该列的子字符串?