SQL WHERE Like子句不返回所有结果
我有一个奇怪的问题,在过去的几个小时里我一直在挠头 我有一个相对简单的TSQLSQL WHERE Like子句不返回所有结果,sql,sql-server,tsql,where-clause,sql-like,Sql,Sql Server,Tsql,Where Clause,Sql Like,我有一个奇怪的问题,在过去的几个小时里我一直在挠头 我有一个相对简单的TSQL SELECT LTRIM(RTRIM(bom_comp_code)) [bom_comp_code] , bom_product , bom.actual_partnumber FROM dbo.MRP_ALL bom WHERE bom.bom_product = 'F00434' 这将返回500行类
SELECT
LTRIM(RTRIM(bom_comp_code)) [bom_comp_code]
, bom_product
, bom.actual_partnumber
FROM
dbo.MRP_ALL bom
WHERE
bom.bom_product = 'F00434'
这将返回500行类似-perfect的结果
[bom_comp_code] [bom_product] [actual_partnumber]
M03275 F00434 99292922
M03275 F00434 99292922
B01869 F00434 99292922
B01869 F00434 99292922
M03275 F00434 99292922
M03275 F00434 99292922
B01869 F00434 99292922
...
...
B01869 F00434 99292922
B01869 F00434 99292922
M03275 F00434 1110-011
M03275 F00434 1110-011
现在我只对以M开头的bom_comp_代码感兴趣,所以我自然会使用以下TSQL
SELECT
LTRIM(RTRIM(bom_comp_code)) [bom_comp_code]
, bom_product
, bom.actual_partnumber
FROM
dbo.MRP_ALL bom
WHERE
bom.bom_product = 'F00434'
AND LTRIM(RTRIM(bom.bom_comp_code)) like 'M%'
但这只返回一行
[bom_comp_code] [bom_product] [actual_partnumber]
M03275 F00434 1110-011
我一辈子都无法理解为什么当表中有224行符合我的条件时只返回一行
LTRIM/RTRIM让我觉得bom_comp_code字段周围有空格,但这不起作用
为了以防万一,我也在bom_产品附近尝试过这个
有什么可能阻止所有行返回?使用LEFT()
如果你真的有空间
AND LEFT(LTRIM(bom_comp_code), 1) = 'M'
要检查字符串开头是否有特殊字符,请按如下方式调试
SELECT LEFT(LTRIM(bom_comp_code), 1) as first_char,
ASCII (LEFT(LTRIM(bom_comp_code), 1)) as ascii_number
LTRIM(bom_comp_code)
FROM dbo.MRP_ALL bom
我也有类似的问题,我有一些特殊的角色,正如上面提到的“胡安·卡洛斯·奥罗佩扎”
使用这个答案中的函数,我可以更新有问题的列,然后正常运行查询。
像'M%'
应该完全可以工作。当您执行像“%M%”这样的时会发生什么?出于好奇。将不匹配的M%行强制转换为varbinary,并查看前导值以确保第一个字节为0x4d,而不是unicode工件(例如复制/粘贴),如其他地方所述,修剪函数仅删除空格。您可以使用如下代码修剪其他空白字符:@Ian您的所有行或所有'M'
行??如果您的列是NVARCHA类型,请改用N'M%'
。这可能是一个排序或unicode问题,就像我曾经遇到的数字和正方形和立方体符号的问题一样。我想你已经给出了字符串位置。提供一种替代方法来做同样的事情并不能回答为什么这件事似乎对OP不起作用-也就是说,为什么像'M%'
不能像预期的那样工作。@下划线\u d确定我的地址那个一开始可能是一个特殊的角色,这没有意义LEFT()
的工作原理应该与类似于M%
您可以转储一些数据,以便我们可以尝试重现该行为吗?是否定义了任何特殊的排序规则?如果无法复制,则说明系统存在问题。检查数据库或字段的排序规则。尝试创建数据库备份并安装到其他服务器中。导出DDL并在rextester上试用。
SELECT LEFT(LTRIM(bom_comp_code), 1) as first_char,
ASCII (LEFT(LTRIM(bom_comp_code), 1)) as ascii_number
LTRIM(bom_comp_code)
FROM dbo.MRP_ALL bom