我发现了这种奇怪的行为,我进行了搜索,但找不到任何相关信息。
我知道在我的示例中,我不需要将[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()
方法是否添加了任何东西?一个空格,一些奇怪的人物?我想念一些愚蠢的东西吗?
答案 0 :(得分:2)
这是因为str()
左用空格填充结果。默认值为10(请参见here)。
我不喜欢将数字用作字符串。但是,如果这样做,显式转换应该可以满足您的要求:
where cast(affairnum as varchar(255)) like '9%'
也就是说,str()
不是类型转换函数。这是一个字符串格式化功能-因此,在您可能不希望的空格处会出现
我应该注意,您甚至不需要将数字显式转换为字符串,因此可以使用:
where affairnum like '9%'
但是,我有如此糟糕的时光记忆,专门用于解决使用隐式转换的SQL代码中的问题,因此我不能出于良心而建议将隐式转换建议给其他人。