我被赋予了查看MSSQL查询问题的任务,而且我不是SQL专业版!这不是我的强项。
我在2个不同的数据库中有2个表;忽略表引用,因为我已将它们从此查询中删除。我的问题是PERSON_CODE是一个表中的整数值,另一个是VARCHAR,我将运行此查询并将数据直接解析到Users表中,同时在PHP中散列密码。
但是,由于Users表中的某些字段是Jane,John这样的字符名称,而且Students中的所有值都是整数,因为数据类型而收到错误。
以下是我到目前为止构建的查询 - 它非常简单:
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表中不是整数的字段,因此我只能从Students表中获得整数结果。
以下是完整的解决方案。谢谢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 / username作为标识符来显示不在两个表中的行。
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))
在某种程度上,我认为我需要一个完整的外部加入。
Table Students_________ Table users
PERSON_CODE____________ username
1______________________ 1
2______________________ 2
3______________________ 3
4______________________
5______________________
6______________________
7______________________
8______________________
通过此查询,我想显示结果4,5,6,7,8
谢谢!
答案 0 :(得分:11)
这对我来说似乎是最好的解决方案:
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)并解决问题。
答案 1 :(得分:1)
试试这个: -
ON Students.PERSON_CODE = CASE
When ISNUMERIC(users.username) = 1 THEN users.username
END
其中条款:
And ISNUMERIC(users.username) = 1
答案 2 :(得分:0)
您也可以这样使用派生表连接进行优化,避免在更大的表中的sql join进程中进行全表扫描。
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
答案 3 :(得分:0)
有时使用ISNUMERIC()不能很好地工作,因为逗号和小数点也将被视为数字。我更喜欢使用TRY_CONVERT(int, a.var_key) = b.int_key
,因为TRY_CONVERT()将提供NULL来忽略JOIN起作用所需的非整数值。