簡體   English   中英

我可以在列類型 INT 和 VARCHAR 之間 LEFT JOIN 嗎?

[英]Can I LEFT JOIN between column types INT and VARCHAR?

我的任務是調查 MSSQL 查詢的問題,但我不是 SQL 專家! 這不是我的強項'。

我在 2 個不同的數據庫中有 2 個表; 忽略表引用,因為我已經從這個查詢中刪除了它們。 我的問題是 PERSON_CODE 是一個表中的整數值,而另一個表中是 VARCHAR,我將運行此查詢並將數據直接解析到用戶表中,同時在 PHP 中散列密碼。

但是,因為用戶表中的某些字段是像 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. 

我需要知道是否有一種方法可以忽略用戶表中不是整數的字段,以便我只能從學生表中獲得整數結果。

下面是完整的解決方案。 謝謝你。

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

這對我來說似乎是最好的解決方案:

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)。

嘗試這個:-

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

where 條款:

And ISNUMERIC(users.username) = 1

有時使用 ISNUMERIC() 效果不佳,因為逗號和小數點也會被視為數字。 我更喜歡使用TRY_CONVERT(int, a.var_key) = b.int_key ,因為 TRY_CONVERT() 會給 NULL 以忽略 JOIN 工作所需的非整數值。

您也可以這樣使用,使用派生表連接進行優化將避免在更大表中的 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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM