您好,我在使用此列数据时遇到问题
cities
Charlotte
Cincinnati
Cleves
Columbus
Fairfield
Fresno
Los Angeles -- HERE IS THE PROBLEM
Los Angeles
Madison
Manhatttan Beach
New York
Orange
Palo Alto
Phoenix
Sacramento
San Francisco
Takoma Park -- maybe this city must have problems also
Tarrytown
Valencia
Washington
我如何过滤该值,修剪的简单方法是什么?我做了我的研究,但我发现很长的 sql 语句我不明白这是否有帮助是一个简单的错误。
这是查询:
-- 3. Write a query that will list all the cities that have customers with a heading of Cities. Only
-- list each city once (no duplicates) and sort in descending alphabetical order.
select distinct customer_city as cities
FROM customers
ORDER BY customer_city ASC
-- left Los Angeles
正如 Erik 在评论中所说,您应该修复错误数据而不是尝试对其进行查询,但如果您绝对无法修复数据,则以下查询将通过用单个空格替换双空格来获得不同的城市列表:
这是一个非常基本的示例,但是,如果未验证输入数据,这可能不是您遇到的唯一导致重复的空白类型。
在 SQL 2017 之前,您需要菊花链多个 REPLACE 语句来替换多个字符。例如,此代码用一个空格替换双空格和制表符:
在 2017 年,您可以使用 TRANSLATE 函数将您正在搜索的所有字符替换为单个字符,然后将该字符替换为空字符,以确保您找到所有完全相同的重复项:
这意味着您不必为要删除的每个字符重复 REPLACE,只需将字符代码 ( + CHAR(?) ) 添加到 TRANSLATE 函数并添加另一个替换字符 (#)。如您所见,TRANSLATE 示例替换 4 个字符的代码量与之前版本中的两个字符替换基本相同。
如前所述,如果可能,更正数据是处理此类情况的最佳方法。您可以就地修复它,或者如果由于某种原因您需要保留错误的值(也许它们与您的松散耦合的另一个系统中的 vales 匹配,这已经依赖于这些值)然后也许通过维护正如 Akina 所建议的,具有标准化数据的阴影列。
如果您正在处理大量数据,那么应用函数 in
DISTINCT
可能不是一个好主意,因为 distinct 操作意味着一种排序,对于大量行可能会导致昂贵的 spool 到磁盘。如果您在查询计划器上有适当的索引,customer_city
则可能可以使用它来完全消除排序的需要。您可以通过对结果执行函数DISTINCT
然后再执行一次来最小化这种影响:DISTINCT
还要注意按相同的值(函数的结果)进行排序,以避免在执行排序和过滤后进行额外的排序。显然,对于少量数据,这是多余的,您应该继续使用更简单的查询,以使代码更易于理解。