sql - LIKE 'x%' 有效,但 LIKE '%x' 不适用于 INT 转换为 STRING

标签 sql sql-server entity-framework t-sql 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() 方法是否添加了任何内容?一个空格,一些奇怪的字符?我错过了一些愚蠢的事情吗?

最佳答案

这是因为 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/

相关文章:

sql-server - 查询以更改 SQL Server 2008 中的表排序规则

c# - SMO 编写整个数据库的脚本,就像 Studio Management 使用 Generate Scripts 所做的那样

entity-framework - Entity Framework 4还是数据集?

c# - 内存泄漏 Entity Framework

MySQL创建表并在行为空时返回特定值

SQL 将字符串转换为日期格式 112

python - 具有 NUMERIC 数据类型的 pandas to_sql()

mysql - 对用户重新排序 按积分排序的排名

mysql - 如果条目不存在,则 SQL Server 返回 NULL(或值) - 多列

c# - Entity Framework - 获取 SQL Server 字段数据类型