【问题标题】:SQL - Like and wildcard, not expected resultSQL - 喜欢和通配符,不是预期的结果
【发布时间】:2020-05-15 16:07:07
【问题描述】:

我还是个 SQL 新手,所以请耐心等待。

我在查询中有以下 WHERE 语句:

WHERE Scopes.Name = 'APAC' AND Sites.City LIKE '%o%'

它产生了以下结果(如预期的那样):

如果我删除结尾通配符,像这样:

WHERE Scopes.Name = 'APAC' AND Sites.City LIKE '%o'

它会导致一个空表。 我无法理解的是,城市名称“Repetto”显然以“o”结尾,因此查询中的 LIKE '%o' 应该产生与 LIKE '%o%' 相同的结果。

我是否误解了通配符的使用? 谁能给我解释一下背后的逻辑?

【问题讨论】:

    标签: sql wildcard sql-like


    【解决方案1】:

    通配符的使用是正确的。这意味着'Repetto'中的o后面有一个字符。

    这可能是隐藏字符或空格。一种可能性是该列被声明为char() 而不是varchar(),因此该值用空格填充。

    【讨论】:

    • 确实是 char(255)。但是这种填充物是从哪里来的呢?我的意思是,为什么需要添加不应该存在的空间?
    • 在 Google 上找到了解释,感谢 Gordon 的提示!简短的回答是:VARCHAR 是可变长度,而 CHAR 是固定长度。 CHAR 是固定长度的字符串数据类型,因此字段中的任何剩余空间都用空格填充。
    【解决方案2】:

    “Repetto”可能有一个结尾“空格”字符。

    WHERE Scopes.Name = 'APAC' AND TRIM(Sites.City) LIKE '%o'
    

    如果是这种情况,带有结尾空格的“Repetto”与“%o”通配符表达式不匹配,但“%o%”匹配。

    【讨论】:

    • 没有空格,至少没有手动添加空格。我已经仔细检查了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多