下面的emp表中没有以三个空格结尾的ENAME。但是,以下SQL语句的行为类似于最后修剪的子句(如'%'模式),因为它返回所有记录:
<clipPath id="left-to-right">
<rect x="0" y="0" width="0%" height="100%" >
<animate attributeName="width" values="0%;100%" dur="5s" fill="freeze"/>
</rect>
</clipPath>
我尝试了很多其他数据库平台(包括SQL Server,SQL Anywhere,Oracle,PostgreSQL,MySQL等),我看到这种情况只发生在Sybase / SAP ASE(版本16)中。这是一个错误还是“按设计”?在这方面online spec没有具体的具体内容。
我正在寻找一个通用修复,将一些简单的转换应用于模式并返回任何其他平台的预期。事先不知道该字段的数据类型或它所拥有的数据类型。
答案 0 :(得分:1)
这是由ASE中的VARCHAR语义引起的,它会在操作之前始终从值中去除前导空格。这在使用之前应用于字符串'%',因为根据定义,它是VARCHAR值。这确实是ASE的特定语义。
现在,您可以尝试使用[]通配符来匹配空格,但有一些事情需要注意。首先,匹配的列(ENAME)必须是CHAR,而不是VARCHAR,否则任何试验空间在存储之前也会被剥离。假设列是CHAR,那么使用模式'%[] [] []'遗憾的是仍然看起来不起作用。我认为这里可能还会发生一些尾随空间剥离。
解决此问题的最佳方法是使用人工结束字段分隔符,这种分隔符不会出现在数据中,例如
ENAME||'~EOF~' like '% ~EOF~'
这很有效。但请注意,ENAME列仍必须是CHAR而不是VARCHAR。
答案 1 :(得分:0)
类似的行为以某种方式记录在here中。
对于VARCHAR列,这将永远不会起作用,因为ASE删除了尾随空格
对于CHAR,它取决于如何在char(10)列中插入数据..如果插入2个字符,ASE将在2个字符后添加8个空格使它们成为10 ..所以当你查询时,您将获得此2个字符条目作为结果集的一部分,因为它包含3个以上的尾随空格..
如果这对您来说不是问题,那么您可以使用char_index()来计算尾随空格并且不会截断它们,因此您可以编写如下内容:
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)))
现在再次 ,如果数据以非统一计数插入,这将获得比预期更多的行,但如果您确切知道要搜索的内容,则会完美地运行。
答案 2 :(得分:-1)
从dbo.emp中选择ename,其中RIGHT(ENAME,3)=''