【问题标题】:Complex problem of rewriting code from SQL Server to Teradata SQL?将代码从 SQL Server 重写为 Teradata SQL 的复杂问题?
【发布时间】:2021-09-14 18:56:32
【问题描述】:

我在 Teradata SQL 表中如下所示:

col1             | col2
----------------------------
Adam Nowak PHU   | Nowak Adam
AAR Kowal Jan    | Kowal Jan
Tomasz Gut       | Juk Anna

我只想选择这些行,其中:

  • 在 col1 中,我有 col2 的值 + 某些东西(不管值之前还是之后)
  • 请注意,姓名顺序并不重要,因此 Jan Kowal 与 Kowal Jan 相同

因此,我需要类似下面的内容,所以只有第一行和第二行,因为 col1 中有来自 col2 的值 + 其他内容,姓名和姓氏的顺序并不重要:

  1. 我使用了如下查询,但我的查询没有考虑到姓名顺序并不重要,并且对于我的代码 Jan Kowal 和 Kowal Jan 是不同的人。
where upper(col1) like '%' || upper(col2) || '%'
  1. 此外,我使用的代码非常适合我的情况并且可以正常工作,但仅在 SQL Server 上,在 Teradata SQL id 上不起作用:
WHERE
      upper(col1) LIKE '%' + substring(upper(col2), 1, CHARINDEX(' ',col2)-1) + '%'

    AND

      upper(col1) LIKE '%' + substring(upper(col2), CHARINDEX(' ',col2)+1, LEN(col2)) + '%'
  1. 我在 Teradata 代码上更改了它,如下所示:
WHERE
  upper(col1) LIKE '%' || substr(upper(col2), 1, nullifzero(index(' ',col2)-1)) || '%'

AND

  upper(col1) LIKE '%' || substr(upper(col2), nullifzero(index(' ',col2)+1, length(col2))) || '%'

但是上面的代码会报错:

SUBSTR:字符串订阅超出范围

  1. 我还尝试了以下方法:
where position(strtok(col2, ' ', 1) in col1) > 0   and position(strtok(col2, ' ', 2) in col1) > 0

但它会产生错误:

STRTOK:InputString 或 Delim 长度为 0;或者toknum参数不大于0,

我能做什么?请帮帮我。

如何在 Teradata SQL 中做到这一点?您能否修改我在 SQL Server 上运行的代码或建议您自己的在 Teradata SQL 上运行的解决方案?

【问题讨论】:

  • 右括号在错误的位置,例如nullifzero(index(' ',col2))-1

标签: sql sql-server teradata teradata-sql-assistant teradatasql


【解决方案1】:

我想你想要regexp_similar():

where regexp_similar(col1, replace(col2, ' ', '|') = 1

【讨论】:

  • 你能重写我所有的代码吗?因为我在你的代码中没有看到 col2 :)
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
相关资源
最近更新 更多