11

我有以下描述:“示例产品制造商产品名称 XYZ - 尺寸”,我只想从中获取值“产品名称 XYZ”。如果这只是一行,我只使用 SUBSTRING 就没有问题,但我有数千条记录,尽管所有产品的初始值 Sample Product Maker 都相同,但 Product Name 可能不同,并且我不想要任何东西之后连字符。

到目前为止,我在这个问题的标题中产生了错误。

SELECT i.Itemid,
       RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev,
       CHARINDEX('-', i.ShortDescription, 0) - 25  as charindexpos
FROM t_items i

我收到“参数数据类型 varchar 对子字符串函数的参数 3 无效”

如您所见,我得到了 sql 语句最后一行的值,但是当我尝试将其插入 SUBSTRING 函数时,我遇到了各种问题。

4

6 回答 6

20

很有可能您有缺少“-”的行,这会导致您的错误。试试这个...

SELECT i.Itemid,
    SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription+'-', 22)) AS ProductDescriptionAbbrev,
FROM t_items i
于 2012-10-23T21:55:15.383 回答
1

您的第一次调用SUBSTRING指定长度为SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)).

你可以试试:

declare @t_items as Table ( ItemId Int Identity, ShortDescription VarChar(100) )
insert into @t_items ( ShortDescription ) values
  ( 'Sample Product Maker Product Name XYZ - Size' )

declare @SkipLength as Int = Len( 'Sample Product Maker' )

select ItemId,
  RTrim( LTrim( Substring( ShortDescription, @SkipLength + 1, CharIndex( '-', ShortDescription, @SkipLength ) - @SkipLength - 1 ) ) ) as ProductDescriptionAbbrev
  from @t_items
于 2012-10-23T20:57:23.367 回答
1

您还可以删除Sample Product Maker文本并从那里开始:

SELECT RTRIM(LEFT(
    LTRIM(REPLACE(i.ShortDescription, 'Sample Product Maker', '')),
        CHARINDEX('-', LTRIM(REPLACE(i.ShortDescription, 'Sample Product Maker', 
    '' ))) - 1))
AS ShortDescription
于 2012-10-23T21:01:26.497 回答
1

问题是您的外部调用SUBSTRING正在从SUBSTRING第三个参数中的内部调用传递一个字符数据类型。

                                                  +--This call does not return an integer type
SELECT i.Itemid,                                  V
   RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev,
   CHARINDEX('-', i.ShortDescription, 0) - 25  as charindexpos
FROM t_items i

第三个参数必须评估为您想要的长度。也许你的意思是LEN(SUBSTRING(...))

于 2012-10-23T22:04:23.203 回答
0

好像你想要这样的东西(22,而不是 25):

SELECT i.Itemid, 
       RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription)-22))) AS ProductDescriptionAbbrev, 
       CHARINDEX('-', i.ShortDescription)-22 as charindexpos
FROM t_items i 
于 2012-10-23T21:40:51.470 回答
0

你要:

LEFT(i.ShortDescription, isnull(nullif(CHARINDEX('-', i.ShortDescription),0) - 1, 8000))

请注意,一个好的做法是将charindex(...)'s 和patindex(...)'s 包装起来nullif(...,0),然后根据需要处理 null 情况(有时 null 是正确的结果,在这种情况下,我们想要所有文本,所以我们isnull(...,8000)想要的长度)。

于 2013-02-14T16:18:04.187 回答