假设:
TEST_TABLE
TEST_TABLE
中名为TEST_FIELD
VARCHAR(50) NOT NULL
的列
SELECT TEST_FIELD FROM TEST_TABLE WHERE ...
问题:
在我的where条件中,我需要测试字符串最后一个字符的值。我注意到在Where子句中执行以下操作的行为相同。
RIGHT(TEST_FIELD,1) > 3
CAST(RIGHT(TEST_FIELD,1) AS INT) > 3
通过案例1中的一些推断演员,他们的行为是否相同?案例1是确定性的吗?
提前致谢。
马特
答案 0 :(得分: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。
答案 1 :(得分:0)
是的情况1是确定性的 - 要么成功从字符串到整数的隐式转换(结束然后是两个整数之间的比较),要么抛出异常。