3

与えられた:

  • SQLサーバー
  • と呼ばれるテーブルTEST_TABLE
  • タイプのTEST_TABLE呼び出された列TEST_FIELDVARCHAR(50) NOT NULL
  • 行1:10YR3 / 6
  • 行2:10YR3 / 2
  • クエリ:SELECT TEST_FIELD FROM TEST_TABLE WHERE ...

質問:

私のwhere条件では、文字列の最後の文字の値をテストする必要があります。Where句で次のことを行っているのと同じ動作に気づきました。

  1. RIGHT(TEST_FIELD,1) > 3
  2. CAST(RIGHT(TEST_FIELD,1) AS INT) > 3

ケース1の推測されたキャストを通じて、同じように動作していますか?ケース1は決定論的ですか?

前もって感謝します。

マット

4

2 に答える 2

2

たとえば、値を確認すると、変換が行われます。

DECLARE @t varchar(100)

SET @t = (SELECT 'ABCA2')

SELECT @t    

IF RIGHT(@t, 2) > 10
  SELECT 'Hi'
ELSE
  SELECT 'Bye'

SQLはエラーをスローせずにA2を整数に変換できないため、エラーをスローします。

ただし、次のように置き換え@tた場合:

SET @t = (SELECT 'ABC12')

上記のコードは、変換が成功し、比較が行われるときに機能します。適切な関数自体は値を変換しません。MSDNは、の戻りタイプをRIGHT()明示的に示しています。

character_expressionが非Unicode文字データ型の場合、varcharを返します。

character_expressionがUnicode文字データ型の場合、nvarcharを返します。

自分で簡単にするためにRIGHT()、たとえばテキストと比較する場合は、関数を完全に削除します。

DECLARE @t varchar(100)

SET @t = (SELECT '1')

SELECT @t

IF @t < 10
  SELECT 'Hi'
ELSE
  SELECT 'Bye'

に電話をかけなかったことに注意してくださいRight()。上記の結果は、1が表示され、次にテキストHiが表示されます。

于 2011-12-22T16:34:07.657 に答える
0

And Yes case 1 is deterministic - either successful implicit conversion from string to integer(end then comparison between two integers) or exception thrown.

于 2011-12-22T16:58:18.247 に答える