Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL如果第一个字段中有字母,如何在另一个字段上联接_Sql_Sql Server - Fatal编程技术网

SQL如果第一个字段中有字母,如何在另一个字段上联接

SQL如果第一个字段中有字母,如何在另一个字段上联接,sql,sql-server,Sql,Sql Server,我有一个SQL连接,看起来像这样 INNER JOIN UPLOAD PH on cast(p.PickTicket_Number as varchar(20))=PH.FIELD004 然而,有时候,我真正想加入的领域是PH.FIELD003。当PH.FIELD004是一个包含字母的不同字段时,就会发生这种情况。我如何在ON子句中包含一个条件,如果field004中没有字母(是数字),它将像上面那样连接,但是如果它确实有字母,它将连接到pickticket number=field003?您

我有一个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
    。希望这足够接近“里面有字母”。如果不是,则可以将
    大小写
    表达式与
    类似
    一起使用
  • 加入
    条件的性能杀手。函数调用(比如转换)也会妨碍优化器
  • 如果性能是一个问题,请提出一个新问题
  • 我猜“number”值是一个
    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
   )

您可以这样表达逻辑:

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
    。希望这足够接近“里面有字母”。如果不是,则可以将
    大小写
    表达式与
    类似
    一起使用
  • 加入
    条件的性能杀手。函数调用(比如转换)也会妨碍优化器
  • 如果性能是一个问题,请提出一个新问题
  • 我猜“number”值是一个
    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
   )

涉及的三列的数据类型是什么?涉及的三列的数据类型是什么?