LIKE 'x%' 有效,但 LIKE '%x' 对转换为 STRING 的 INT 无效

LIKE 'x%' works, but LIKE '%x' doesn't work on INT converted to STRING

我发现了这种奇怪的行为,我进行了搜索但没有找到任何相关信息。 我知道在我的示例中我不需要将 [affairenum] 转换为 STRING,但是由于 Entity Framework 中的特定语法,这就是 Affairenum.Contains()StartsWith()EndsWith() 最终生成。

考虑一个 table 的例子,它包含一个 id(affaireid 列)和数字(affairenum 列),其值从 1 到 5000000。

SELECT TOP (1000) [affaireid]
      ,[affairenum]
      ,STR(affairenum) AS string
  FROM [dbo].[ULAffaire]
where STR(affairenum) LIKE N'%9'

有效并 returns 结果。 N'%9%'.

也是如此
SELECT TOP (1000) [affaireid]
      ,[affairenum]
      ,STR(affairenum) AS string
  FROM [Ulysse].[dbo].[ULAffaire]
where STR(affairenum) LIKE N'9%'

不起作用,returns 什么都没有。这里的区别是 LIKE N'9%',相当于 StartsWith().

STR(affairenum) 看起来与 affairenum 相同,EndsWith()Contains() 都可以正常工作,但是这个 returns 没什么。

我试过 LOWER(),但无济于事。 STR() 方法是否添加了任何内容?一个 space,一些奇怪的字符?我错过了什么愚蠢的东西吗?

那是因为 str() 左边用空格填充了结果。默认长度为 10(参见 here)。

我不喜欢将数字用作字符串。但是如果你这样做,显式转换应该做你想做的:

where cast(affairnum as varchar(255)) like '9%'

str()不是类型转换函数。它是一个字符串格式化函数——因此存在您可能不希望出现的空格。

我应该注意到,您甚至不需要将数字显式转换为字符串,所以这是可行的:

where affairnum like '9%'

但是,我对修复 SQL 代码中使用隐式转换的问题的时间和时间记忆犹新,因此我不能凭良心向其他人建议隐式转换。