【问题标题】:LIKE clause in Sybase/SAP ASE trimmed at the end?最后修剪 Sybase/SAP ASE 中的 LIKE 子句?
【发布时间】:2016-06-18 23:25:51
【问题描述】:

下面的 emp 表没有以三个空格结尾的 ENAME。但是,下面的 SQL 语句的行为就像子句在末尾被修剪(就像 '%' 模式),因为它返回所有记录:

select ENAME from dbo.emp where ENAME like '%   '

我尝试了许多其他数据库平台(包括 SQL Server、SQL Anywhere、Oracle、PostgreSQL、MySQL 等),我只在 Sybase/SAP ASE(版本 16)中看到过这种情况。这是一个错误还是“设计使然”?在这方面,online spec 中没有发现任何具体内容。

我正在寻找一个通用的修复程序,对模式应用一些简单的转换并返回任何其他平台所期望的内容。事先不知道该字段是什么数据类型或它包含什么类型的数据。

【问题讨论】:

    标签: sap-ase sql-like


    【解决方案1】:

    这是由 ASE 中的 VARCHAR 语义引起的,它总是在对值进行操作之前从值中去除前导空格。这在使用之前应用于字符串 '% ',因为根据定义,它是一个 VARCHAR 值。这确实是 ASE 的一种特殊语义。

    现在,您可以尝试使用 [ ] 通配符匹配空格来解决此问题,但有一些事情需要注意。首先,被匹配的列 (ENAME) 必须是 CHAR,而不是 VARCHAR,否则任何试用空间在存储之前也将被剥离。假设该列是 CHAR,那么不幸的是,使用模式 '%[ ][ ][ ]' 似乎仍然不起作用。我认为这里可能仍在发生一些尾随空格剥离。

    解决此问题的最佳方法是使用不会出现在数据中的人工字段结束分隔符,例如

    ENAME||'~EOF~' like '%   ~EOF~'
    

    这行得通。但请注意,列 ENAME 仍必须是 CHAR 而不是 VARCHAR。

    【讨论】:

    • 谢谢,RobV。我会投票并标记为答案,但我仍然对修复不满意。如果可能的话,我正在寻找更通用的东西(请参阅我编辑的问题的结尾)。
    • 我认为没有更好的解决方法。 VARCHAR 表达式中尾随空格周围的 ASE 语义先于其他任何东西起作用。
    【解决方案2】:

    here 中以某种方式记录了类似的行为。

    对于 VARCHAR 列,这永远不会起作用,因为 ASE 删除了尾随空格

    对于 CHAR,这取决于您如何插入数据.. 在 char(10) 列中,如果您插入 2 个字符,ASE 将在 2 个字符后添加 8 个空格以使它们成为 10 .. 所以当您查询时,您将获得这 2 个字符条目作为结果集的一部分,因为它包含超过 3 个尾随空格..

    如果这对您来说不是问题,您可以使用 char_index () 而不是 like,它会计算尾随空格并且不会截断它们,因此您可以编写如下内容:

    select ENAME from dbo.emp where char_index('   ',ENAME) >0
    

    或者你可以计算尾随空格,然后检查你的 3 个空格是否在后面,比如:

    select a from A 
    where charindex('    ',a) > (len(a) - len(convert (varchar(10) , a)))
    

    现在再次,如果数据以非统一计数插入,这将获得比预期更多的行,但如果您确切知道要搜索的内容,它将完美地工作。

    【讨论】:

      【解决方案3】:

      从 dbo.emp 中选择名称,其中 RIGHT(ENAME ,3) = '    '

      【讨论】:

        猜你喜欢
        • 2021-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 2020-05-28
        • 1970-01-01
        相关资源
        最近更新 更多