2016-10-24 7 views
0

この文字列はParent_IDという列にあります。そこに存在する文字列の例:私はこのコードを書いたときサブストリング(...、...、CHARINDEX(....) - 0.5)関数

RBIA-3340-CU-XM-01-D/RBIA-3340-01-4-D-34080-11441A1-2TC-001 

/B1

なし::

SELECT Substring([parent_id], 1, 
       CHARINDEX('/B',parent_id,25)-1) 
FROM [c3d_aug].[dbo].[atta_properties] 

を私が得た

RBIA-3340-CU-XM-01-D/RBIA-3340-01-4-D-34080-11441A1-2TC-001/B1 

私が欲しいものは得ることですこのエラー:

"Msg 537, Level 16, State 3, Line 1 Invalid length parameter passed to the LEFT or SUBSTRING function."

私は誤って-1-0.5に変更しましたが、正常に動作しました。

SELECT Substring([parent_id],1, 
       CHARINDEX('/B',parent_id,25)-0.5) 
FROM [c3d_aug].[dbo].[atta_properties] 

誰かが理由を説明できますか?上記のメインストリングにスペースは含まれていないことに注意してください。

+0

あなたの例では、CHARINDEXが60を返しています。 –

+0

宣言@Parentid varchar(max)= 'RBIA-3340-CU-XM-01-D/RBIA-3340-01-4-D-34080-11441A1-2TC -001/B1 ' select charindex('/B '、@ parentid) - 返品60 サブストリングを選択します(@ parentid、1、charindex('/B '、@ parentid) - 1) –

答えて

1

-0.5を使用することはお勧めしません。浮動小数点数が(関数が必要とするように)整数に変換されるとき、負数は負数がゼロに向かって「切り捨てられる」ため、おそらく機能します。

私が代わりにお勧めします:

SElECT LEFT([parent_id], 
      CHARINDEX('/B', parent_id + '/B', 25) - 1 
      ) 
FROM [c3d_aug].[dbo].[atta_properties]; 

文字列の最後にパターンを追加することで、あなたはCHARINDEX()から0のリターンを心配する必要はありません。

LEFT()は、SUBSTRING()よりもずっと便利です。

+0

もう一度尋ねて申し訳ありませんが、なぜcharindex関数から0を得るのでしょうか? –

+0

関数は特定の文字の位置を与えるはずですか? 私はちょうどSQLに新しいです、たくさんのお問い合わせを申し訳ありません とあなたのお返事ありがとうございます。 –

+0

@AutomationENG。 。 。文字列が見つからない場合、関数は '0'を返します。 –