我发现了这种奇怪的行为,我进行了搜索,但找不到任何相关信息。
我知道在我的示例中,我不需要将 [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()
方法是否添加了任何内容?一个空格,一些奇怪的字符?我错过了一些愚蠢的事情吗?
最佳答案
这是因为 str()
left 用空格填充结果。默认长度为 10(请参阅 here )。
我不喜欢使用数字作为字符串。但如果您这样做,显式转换应该可以满足您的要求:
where cast(affairnum as varchar(255)) like '9%'
也就是说,str()
不是类型转换函数。它是一个字符串格式化函数——因此会在您意想不到的地方出现空格。
我应该注意,您甚至不需要显式地将数字转换为字符串,因此这是有效的:
where affairnum like '9%'
但是,我对花费大量时间致力于解决使用隐式转换的 SQL 代码中的问题的内存非常糟糕,因此我不能凭良心向其他人建议隐式转换。
关于sql - LIKE 'x%' 有效,但 LIKE '%x' 不适用于 INT 转换为 STRING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52952886/