将变量设置为自身的子串以进行查询

时间:2017-03-09 20:12:34

标签: sql sql-server

我有一个用于返回值的查询:

DECLARE @ VALUE varchar(1000) = 'ACELLA PHARMA [A200]' 
select
   a.item_id,
   attr_vals = concat(a.attr_val, ' ', quotename(b.attr_val)) 
from
   ndc_attr as a 
   left outer join
      [NDC_ATTR] b 
      on b.field_id = 144 
      and a.field_id = 225 
where
   b.attr_val is not null 
   and b.attr_val like '%' +@ VALUE + '%'

问题是我需要括号内的值:本例中为A200。

我试图通过在其中添加if语句来分解查询:

if @VALUE like '%[%' and @VALUE like '%]%'
begin
SET @VALUE = SUBSTRING(@VALUE, CHARINDEX('[', @VALUE) + 1, LEN(@VALUE) - 1)
end 

但奇怪的是,完整的字符串正在返回(' ACELLA PHARMA [A200]')。

如何分解此值,以便只有括号内的字符串位于@VALUE?

3 个答案:

答案 0 :(得分:2)

如果您希望 square 中的部分括号值看示例,那么这是一个快捷方式:

select replace(stuff(@value, 1, charindex('[', @value), ''), ']','')

我不确定查询与问题有什么关系,但当然可以在查询中应用示例逻辑。

答案 1 :(得分:1)

你很接近......应该这样做。

declare @value varchar(max)
set @value = 'ACELLA PHARMA [A200]' 

if charindex('[',@value)>0 and charindex(']',@value)>0
begin
    select @value=substring(@value, charindex('[', @value)+1, len(@value) - charindex('[', @value)-1)
end
select @value

答案 2 :(得分:1)

你正试图这样做吗?

declare @value varchar(1000) = 'ACELLA PHARMA [A200]' 
declare @b_attr_val varchar(16);
/* Gordon Linoff's answer here: */
set @b_attr_val= replace(stuff(@value, 1, charindex('[', @value), ''), ']','');

select
    a.item_id
  , attr_vals = concat(a.attr_val, ' ', quotename(b.attr_val)) 
from ndc_attr as a 
   left outer join [NDC_ATTR] b 
      on b.field_id = 144 
     and a.field_id = 225 
where b.attr_val = @b_attr_val;