2014-01-23 35 views
5

我已经被赋予查看MSSQL查询问题的任务,并且我不是SQL专家!这不是我的特长。我可以在列类型INT和VARCHAR之间左连接吗?

我在2个不同的数据库中有2个表;忽略表引用,因为我把它们从这个查询中剥离出来。我的问题是PERSON_CODE是一个表中的整数值,另一个是VARCHAR,我将运行此查询并将数据直接解析到Users表中,同时用PHP对哈希密码进行哈希处理。

但是,由于Users表中的某些字段是像Jane,John这样的字符名称,学生中的所有值都是整数,因此我收到错误是因为数据类型。

下面是到目前为止,我已经建立了查询 - 这是非常简单的:

SELECT Students.PERSON_CODE, Students.PASSWORD 
FROM Students 
LEFT JOIN users 
ON Students.PERSON_CODE = users.username 
WHERE Students.PERSON_CODE > '0' 
AND users.username IS INTEGER <- How do i do this. 

我需要知道,如果有忽略不属于users表中的整数,所以我可以得到字段的方式学生表中只有整数结果。

下面是完整的解决方案。谢谢Preveen。

SELECT Students.PERSON_CODE, Students.PASSWORD 
FROM Students 
LEFT JOIN users 
ON Students.PERSON_CODE = CASE 
          When ISNUMERIC(users.username) = 1 THEN users.username 
          END 
WHERE Students.PERSON_CODE > '0' 

新更新

,因为我希望查询显示了使用PERSON_COde /用户名作为标识符,不是两个表中唯一行我已经做了一些改动。

SELECT Students.PERSON_CODE, Students.PASSWORD 
FROM Students 
LEFT JOIN users 
ON cast(Students.PERSON_CODE as varchar(15)) = users.username 
WHERE users.username = cast(Students.PERSON_CODE as varchar(15)) 

在某种程度上,我需要一个完整的outter加入基本上我认为。

Table Students_________ Table users 
PERSON_CODE____________ username 
1______________________ 1 
2______________________ 2 
3______________________ 3 
4______________________ 
5______________________ 
6______________________ 
7______________________ 
8______________________ 

有了这个查询然后我想显示的结果4,5,6,7,8

谢谢!

+0

感谢您编辑Bhadra,对不起,我忘了在删除最后一行的第二条评论后更改SQL!卫生署。 –

+0

是你的问题在这里回答? http://stackoverflow.com/questions/5064977/detect-if-value-is-number-in-mysql – Bokw

+1

你应该把'PERSON_CODE''0''改成'PERSON_CODE> 0',因为它是一个整数 – NickyvV

回答

10

这似乎是最好的解决办法对我说:

SELECT Students.PERSON_CODE, Students.PASSWORD 
FROM Students 
LEFT JOIN users 
ON cast(Students.PERSON_CODE as varchar(10)) = users.username 
WHERE Students.PERSON_CODE > 0 

这样你就不需要检查,如果用户名是一个整数。在比较和解决问题之前,只需将PERSON_CODE转换为varchar(10)即可。

+0

+1这似乎比我发布的更好 – praveen

+0

@praveen我正在研究一种类似于你的突然变得清晰了 –

+0

你们两个都是对的,我遇到了PRaveen解决方案的问题,因为它每次都会返回全套。 –

1

试试这个: -

ON Students.PERSON_CODE = CASE 
          When ISNUMERIC(users.username) = 1 THEN users.username 
          END 

WHERE子句:

And ISNUMERIC(users.username) = 1 
+0

为true,但他使用带有WHERE子句的LEFT JOIN,这会给出上述代码的另一个结果。 – NickyvV

+0

@NickyvV:谢谢你让我知道更新的答案 – praveen

+0

NickyvW我。我会尝试这Praveen –

0

你可以用这样也,优化使用派生表将避免在SQL全表扫描在一个更大的表连接过程。

SELECT Students.PERSON_CODE, Students.PASSWORD 
FROM Students 
LEFT JOIN 
(SELECT users.username FROM users 
WHERE ISNUMERIC(users.username)= 1) As Myusers 
ON Students.PERSON_CODE = Myusers.username 
WHERE Students.PERSON_CODE > 0 
+1

isnumeric与INT不完全一样.. – NickyvV

相关问题