【问题标题】:Filter SQL Query based on Non-Alpha First Character基于非字母首字符过滤 SQL 查询
【发布时间】:2011-07-15 05:36:23
【问题描述】:

我正在尝试过滤第一个字母不是字母的 VARCHAR 列。

例如
values = ['.net', '30 days', 'apple', 'beta']

返回 ['.net', '30 天']

注意:作为参考,这是按首字母将名称分组到过滤器存储桶中,其中任何非字母字符都被分组为“#”(想想 iPhone 联系人浏览分组)。

使用 LIKE 或子字符串过滤单个字母很容易,但我找不到过滤所有非字母字符的简单方法。

编辑:它是区分大小写的,但我期待所有的时间都是小写的。

【问题讨论】:

    标签: sql filter filtering


    【解决方案1】:

    解决方案是否简单:

    SELECT * 
    FROM SomeTable 
    WHERE SomeColumn NOT LIKE '[A-z]%'
    

    ?

    编辑:将 [A-Z] 更改为 [A-z] 以防万一您使用区分大小写的排序规则。

    【讨论】:

    • +1 不错。在 sql 服务器上工作。但它是否兼容所有数据库?
    • 我很确定 LIKE 运算符不仅仅被 T-SQL 支持。我没有足够的其他系统经验,无法为您提供明确的列表,但我建议您尝试一下并反馈。
    • LIKE 是可移植的。范围语法不是 AFAIK。顺便说一句,最好使用'[A-z]%',这样它就可以在zebra等字符串的区分大小写排序规则中正常工作
    • 我们可以回答自己的问题吗?一位同事为此案例建议了一个备用查询:SELECT * FROM SomeTable WHERE SomeColumn < 'a'
    • @miguardo 恕我直言,这是个坏主意。查看 ASCII 码表,你会发现在 'z' 之后有一些非字母,而在 'Z' 和 'a' 之间还有更多的非字母。
    【解决方案2】:
    select * from table
    where ASCII(Name) NOT BETWEEN 65/* A */ and 90/* Z */
     AND ASCII(Name) NOT BETWEEN 97 /* a */ AND 122 /* z */
    

    您没有指定风味,所以这是 TSQL,尽管我相信大多数 SQL 实现都支持 ASCII。内联注释字符 (/* */) 可能不同。

    【讨论】:

    • 根本不使用索引。 LIKE 在SQL standard 中,可能至少使用索引。 ASCII 在 ANSI SQL 92 中没有提到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多