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 代码中使用隐式转换的问题的时间和时间记忆犹新,因此我不能凭良心向其他人建议隐式转换。
我发现了这种奇怪的行为,我进行了搜索但没有找到任何相关信息。
我知道在我的示例中我不需要将 [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 代码中使用隐式转换的问题的时间和时间记忆犹新,因此我不能凭良心向其他人建议隐式转换。