2012-10-23 42 views
11

「サンプル製品メーカーの製品名XYZ - サイズ」という記述がありますが、これから「製品名XYZ」という値を取得したいと思います。これが単なる行であれば、SUBSTRINGを使用するだけで何も問題はありませんが、何千ものレコードがあります。初期値Sample Product Makerはすべての製品で同じですが、製品名は異なる可能性があります。ハイフン。LEFTまたはSUBSTRING関数に無効な長さパラメータが渡されました

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

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 

は私が

あなたが見ることができるように、私がしようとしたとき、私は最後の行のSQL文を値を取得しますが午前と「引数のデータ型varchar型がsubstring関数の引数3には無効です」取得していますSUBSTRING関数にプラグインすると、さまざまな問題が発生します。

答えて

18

「 - 」がない行がある可能性があります。エラー。 問題がSUBSTRINGにあなたの外側の呼び出しは三番目のパラメータで、内側SUBSTRINGコールから文字データ型が渡されていることである

SELECT i.Itemid, 
    SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription+'-', 22)) AS ProductDescriptionAbbrev, 
FROM t_items i 
+1

報告されたエラー( '引数データ型varcharは部分文字列関数の引数3に対して無効です)は、検索されたデータではなく、OPのSQL文の構文に基づいています。 – HABO

+0

検索されたデータだけで問題の行を探し出さないでください。 WHERE句の前にある基になるデータセットに含めることができます。そのため、問題の行を見つけるのは難しくなりますが、この方法ではどちらの場合でも解決します。 – pghcpa

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 
+0

これは答えですか?私はこれを働かせるためにあらゆる種類のことを試みてきました。理想的には、前のステートメントの第3引数としてcharindexposを使用しますが、それはどちらも機能しませんでした。 – brianhevans

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 
+0

これは私が以前に持っていたのと同じ問題を私にもたらし、それは本当に私が求めていたものではありません.... – brianhevans

+1

いいえ、それはありません。これにより、正しい結果が得られます。元の問題は、最初のSUBSTRINGの3番目のparmにintの代わりに文字列を使用していました。そして、22の代わりに22の位置から開始します。 – GilM

+0

これに対する答えは、私の文字列の中には " - "がないので、部分文字列に負の値を返していて、うまくいきません。より良いエラー記述子がありました。ありがとう – brianhevans

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 
1

...これを試してみてください。

            +--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(...))を意味しましたか?

0

は、あなたがしたい:良い練習がnullif(...,0)charindex(...)年代とpatindex(...)年代をラップし、必要であれば、その後はnullの場合を扱うためにあることを

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

注意を(時にはヌル右の結果は、この中で、あります私たちが望む長さのためにすべてのテキストをisnull(...,8000)にしたい場合)。

関連する問題