11

「Sample Product Maker Product Name XYZ - Size」という説明があり、これから「Product Name XYZ」という値のみを取得したいと考えています。これが 1 行だけの場合、SUBSTRING を使用するだけで問題はありませんが、何千ものレコードがあり、初期値の Sample Product Maker はすべての製品で同じですが、製品名は異なる可能性があり、その後は何も必要ありません。ハイフン。

これまでのところ、この質問のヘッダーにエラーが発生しています。

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

「部分文字列関数の引数 3 の引数データ型 varchar は無効です」というメッセージが表示されます

ご覧のとおり、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

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(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

問題は、外部呼び出しが3 番目のパラメーター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

3 番目のパラメーターは、必要な長さに評価される必要があります。おそらくあなたは意味しましたLEN(SUBSTRING(...))か?

于 2012-10-23T22:04:23.203 に答える
0

あなたがしたい:

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

charindex(...)とを でラップpatindex(...)nullif(...,0)、必要に応じて null ケースを処理することをお勧めします (null が正しい結果である場合もあります。この場合、すべてのテキストが必要なisnull(...,8000)ため、必要な長さにします)。

于 2013-02-14T16:18:04.187 に答える
0

次のようなものが必要なようです (25 ではなく 22):

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 に答える