【问题标题】:Teradata LIKE operator without wildcard?没有通配符的 Teradata LIKE 运算符?
【发布时间】:2013-08-04 10:33:50
【问题描述】:

在 Oracle 中,LIKE 运算符可以使用或不使用通配符。 例如“where name like 'SMITH'”将返回 name 列正好是 'SMITH' 的行, 和 "where name like 'SMITH%'" 将返回 name 列以 'SMITH' 开头后跟 0 个或多个其他字符的行。

但是,在 Teradata 中,“像 'SMITH' 这样的名称”不会返回任何内容。如果不使用通配符,ANSI 标准是否不指定 LIKE 运算符的行为?

布尔代数说 'SMITH' 就像 'SMITH' 是真的。 Oracle 就是这样做的; Teradata 没有。是否可以调整 Teradata SQL 以使 LIKE 运算符既可以使用通配符也可以不使用通配符?

【问题讨论】:

  • “可以调整 Teradata SQL 以使 LIKE 运算符在使用和不使用通配符的情况下都可以工作吗?” - 是的:如果不存在,请添加通配符。
  • 布尔代数什么时候这么说的?我一定错过了那个谈话。是在 TED 上吗?

标签: sql oracle teradata


【解决方案1】:

这是我在每个 Teradata 版本中得到的:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT
   CASE WHEN 'smith' LIKE 'smith'  THEN 'equal' ELSE 'not equal' END,
   CASE WHEN 'smith' LIKE 'smith ' THEN 'equal' ELSE 'not equal' END,
   CASE WHEN 'smith' =    'smith ' THEN 'equal' ELSE 'not equal' END;


 *** QUERY completed. One ROW FOUND. 3 COLUMNS returned.
 *** Total elapsed TIME was 1 SECOND.

<CASE  expression>  <CASE  expression>  <CASE  expression>
------------------  ------------------  ------------------
equal               not equal           equal   

这绝对是 100% 符合标准 SQL 的。

您可能所做的是将 CHAR 列或 VARCHAR 列与其中的一些尾随空格进行比较。 Oracle 在比较之前用空格默默地填充较短的字符串(根据标准 SQL,这是错误的),类似于使用相等 (=) 的比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多