3

鉴于:

  • SQL 服务器
  • 表调用TEST_TABLE
  • TEST_TABLE被调用TEST_FIELD类型的列VARCHAR(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')

上面的代码将在转换成功并且可以进行比较时起作用。正确的功能本身不会转换您的价值。MSDNRIGHT()明确声明返回类型:

当 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

是的,情况 1 是确定性的 - 从字符串到整数的成功隐式转换(然后结束两个整数之间的比较)或抛出异常。

于 2011-12-22T16:58:18.247 回答