【问题标题】:SQL WHERE Like Clause not returning all resultsSQL WHERE Like 子句不返回所有结果
【发布时间】:2023-03-26 10:17:01
【问题描述】:

我有一个奇怪的问题,过去几个小时我一直在摸索。

我有一个比较简单的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 行结果,例如 - 完美

[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_code 感兴趣,所以我自然会使用下面的 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_product 以防万一。

什么可能阻止我的所有行返回?

【问题讨论】:

  • LIKE 'M%' 应该完全可以工作。当您执行LIKE '%M%' 时会发生什么?只是出于好奇。
  • 将不匹配的 M% 行转换为 varbinary 并查看前导值以确保第一个字节是 0x4d,而不是 unicode 工件(例如复制/粘贴)
  • 如其他地方所述,修剪功能仅删除空格。 Ref。您可以使用 this 之类的代码修剪其他空白字符。
  • @Ian 你所有的行或你所有的'M' 行??
  • 如果您的列是 NVARHA 类型,请改用 N'M%'。这可能是一个排序规则或 unicode 问题,就像我曾经遇到的数字以及正方形和立方体符号

标签: sql sql-server tsql where-clause sql-like


【解决方案1】:

使用LEFT()

AND LEFT(bom_comp_code, 1) = 'M'

如果你真的有空格

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 

【讨论】:

  • 我猜你已经给出了字符串位置
  • 提供另一种方法来做同样的事情并不能回答为什么该事情似乎不适用于 OP - 即为什么 like 'M%' 没有按预期工作。
  • @underscore_d 好的,我解决这个问题。可能是开头的特殊字符
  • 这没有意义。 LEFT() 应该和LIKE M% 一样工作你能在rextester.com 中转储一些数据,以便我们可以尝试重现该行为吗?是否定义了任何特殊的排序规则?
  • 如果您无法重现,则说明您的系统有问题。检查数据库或字段的排序规则。尝试创建数据库的备份并安装在不同的服务器中。导出 DDL 并在 rextester 上试用。
【解决方案2】:

我遇到了类似的问题,我遇到了上面提到的“Juan Carlos Oropeza”中提到的特殊字符。

使用此答案https://stackoverflow.com/a/14211957/7141065 中的函数,我能够更新有问题的列并在此之后正常运行查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多