需要SQL帮助(Exclude,Exists,isNumeric)

时间:2017-10-30 16:41:47

标签: sql sql-server tsql

我正在处理报告,这让我很紧张,因为我不能做简单的查询来排除订单表中不存在的用户。这应该是简单的查询,但我需要加入两个表。

Select User_ID, FirstName, Surname, UserType
FROM user
Left Join Order. ID ON Order.User_Id = User.User_ID
User_ID = Order_Ref WHERE Oder_Ref IS NULL
Where UserType ='Super'

现在我遇到报告,其中Order.User_ID具有varchar数据类型,遗憾的是,我无法创建正确提取数据的查询。正确的是因为我尝试使用isNumeric(Order.User_Id),使用正则表达式,WHERE Order.User_Id不喜欢'%[^ 0-9]%'和Order.User_Id!='',使用not exists语句。以上都没有真正帮助过。

目前我最终得到了:

Select User.User_Id, isNumeric(Order.Order_Id)
FROM User Left Join
     Order
     ON User.User_Id =  Order.User_Id
WHERE (Order.Order_Id IS NULL AND ISNUMERIC(Order.Order_Id) = 1  AND User.UserType = 'Super')

此查询编译没有任何问题,但它不返回任何内容。 你能不能给我一个提示做什么的提示。

我真的很感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

更改

Left Join Order ON Order.User_Id = User.User_ID

inner Join Order  ON Order.User_Id = User.User_ID

这会将结果限制为具有订单的用户。您发布的代码存在必须修复的语法错误。

答案 1 :(得分:1)

首先 - 如果user_id在[user]和[order]表中是相同的,那么它们应该具有相同的数据类型,应该强制执行参照完整性(例如,通过PK / FK关系)。我知道这可能不是你的电话。

下一步 - ISNUMERIC没有做到人们认为它做的事情。要理解我所说的运行这些查询并试图弄清楚ISNUMERIC真正做了什么:

select ISNUMERIC('$'), ISNUMERIC($), ISNUMERIC('$.,'), ISNUMERIC('$,'), ISNUMERIC('10,,0'), ISNUMERIC('');

select ISNUMERIC(''), cast('' as int), ''+2;
--select ISNUMERIC('$'), '$'+2; -- this errors, but is still worth runnning 

对于你所描述的内容,我会使用子查询并在连接之前进行过滤,如下所示:

请注意,我提供了几种可以检查非数字字符的方法。

select [User].User_Id, isNumeric([Order].Order_Id)
from [User] 
Left Join 
(
  select [order].Order_Id
  from   [order]
  where  [order].Order_Id NOT like '%[^0-9]%' -- contains only numbers
  --where patindex('%[^0-9]%', [order].Order_Id) = 0
  --where try_cast([order].Order_Id as int) is not null -- SQL Server 2012+
  and [User].UserType = 'Super'

) [order]
on [User].User_Id =  [order].User_Id