LIKE'x%'有效,但LIKE'%x'在转换为STRING的INT上不起作用

时间:2018-10-23 15:35:48

标签: sql sql-server entity-framework tsql sql-like

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

例如,考虑一个表,其中包含一个ID(affaireid列)和一个数字(affairenum列),其值在1到5000000之间。

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

工作并返回结果。 N'%9%'也是如此。

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

不起作用,不返回任何内容。区别在于LIKE N'9%',相当于StartsWith()

STR(affairenum)看起来与affairenum相同,EndsWith()Contains()都可以正常工作,但是什么也不返回。

我尝试使用LOWER(),但无济于事。 STR()方法是否添加了任何东西?一个空格,一些奇怪的人物?我想念一些愚蠢的东西吗?

1 个答案:

答案 0 :(得分:2)

这是因为str()左用空格填充结果。默认值为10(请参见here)。

我不喜欢将数字用作字符串。但是,如果这样做,显式转换应该可以满足您的要求:

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

也就是说,str()不是类型转换函数。这是一个字符串格式化功能-因此,在您可能不希望的空格处会出现

我应该注意,您甚至不需要将数字显式转换为字符串,因此可以使用:

where affairnum like '9%'

但是,我有如此糟糕的时光记忆,专门用于解决使用隐式转换的SQL代码中的问题,因此我不能出于良心而建议将隐式转换建议给其他人。