繁体   English   中英

SQL 如果第一个字段中有字母,如何加入另一个字段

[英]SQL how to join on another field if the first field has letters in it

我有一个看起来像这样的 SQL 连接

INNER JOIN UPLOAD PH on cast(p.PickTicket_Number as varchar(20))=PH.FIELD004

但是,有时,我真正想加入的领域是 PH.FIELD003。 当 PH.FIELD004 是一个包含字母的不同字段时,就会发生这种情况。 如何在 ON 子句中包含一个条件,如果 field004 中没有字母(是数字),它会像上面那样连接,但如果它确实有字母,它会连接到 pickticket number = field003?

你可以这样表达逻辑:

UPLOAD PH 
ON cast(p.PickTicket_Number as varchar(20)) = PH.FIELD004 OR
   (TRY_CONVERT(int, PH.FIELD004) IS NULL AND
    CAST(p.PickTicket_Number as varchar(20)) = PH.FIELD003
   )

笔记:

  • 这将检查FIELD004不能转换为INT 希望这足够接近“里面有字母”。 如果没有,您可以将CASE表达式与LIKE一起使用。
  • ORJOIN条件的性能杀手。 Function 调用(比如转换)也会阻碍优化器。
  • 如果性能是一个问题,请提出一个问题。
  • 我猜“数字”值是一个INT 如果不是,请更改为适当的类型。
  • 将数字转换为字符串进行比较可能很危险。 例如,我遇到了前导 0 的问题。

由于上一个问题,我建议:

UPLOAD PH 
ON TRY_CONVERT(INT, PH.FIELD004) = p.PickTicket_Number  OR
   (TRY_CONVERT(int, PH.FIELD004) IS NULL AND
    p.PickTicket_Number= PH.FIELD003
   )

假设 PickTicket_Number 和 FIELD003 是整数, FIELD004 是 varchar:

INNER JOIN UPLOAD PH ON p.PickTicket_Number = TRY_CAST(PH.FIELD004 AS INT) OR
                        p.PickTicket_Number = PH.FIELD003

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM