簡體   English   中英

Sql查詢獲取名稱列為null

[英]Sql query getting name column null

Sql小提琴

CREATE TABLE [Users_Reg]
(
   [User_ID]        [int] IDENTITY (1, 1) NOT NULL CONSTRAINT User_Reg_P_KEY PRIMARY KEY,
   [Name]           [varchar] (50) NOT NULL, 
   [Type]           [varchar] (50) NOT NULL /*Technician/Radiologist*/
)

CREATE Table [Study]
(
  [UID]             [INT] IDENTITY (1,1) NOT NULL CONSTRAINT Patient_Study_P_KEY PRIMARY KEY,
  [Radiologist]     [int], /*user id of Radiologist type*/
  [Technician]      [int], /*user id of Technician type*/

)


select * from Study
inner join Users_Reg
on Users_Reg.User_ID=Study.Radiologist

在patient_study表中,放射科醫師或技師可能有0值。 我如何從查詢中獲得技術員姓名和放射科醫生姓名。

您需要兩次在users_reg表上加入以獲得結果。 一次是放射科醫師,另一次是技術人員:

select ps.uid,
  ur1.name rad_name,
  ur1.type rad_type,
  ur2.name tech_name,
  ur2.type tech_type
from Patient_Study ps
left join Users_Reg ur1
  on ur1.User_ID=ps.Radiologist
left join Users_Reg ur2
  on ur2.User_ID=ps.Technician;

請參閱SQL Fiddle with Demo 這將返回所有患者研究的放射科醫師和技師名稱/類型。 如果要替換任何列中的null,則可以使用類似於以下內容的COALESCE

select ps.uid,
  coalesce(ur1.name, '') rad_name,
  coalesce(ur1.type, '') rad_type,
  coalesce(ur2.name, '') tech_name,
  coalesce(ur2.type, '') tech_type
from Patient_Study ps
left join Users_Reg ur1
  on ur1.User_ID=ps.Radiologist
left join Users_Reg ur2
  on ur2.User_ID=ps.Technician;

請參閱SQL Fiddle with Demo

在你的情況下你可以使用isnull

select * 
from Patient_Study as PS
    inner join Users_Reg as U on U.User_ID = isnull(nullif(PS.Radiologist, ''), PS.Technician)

或兩個left outer joins

select PS.*, isnull(UP.Type, UT.Type) as Type
from Patient_Study as PS
  left outer join Users_Reg as UP on UP.User_ID = PS.Radiologist
  left outer join Users_Reg as UT on UT.User_ID = PS.Technician;

SQL FIDDLE示例。

作為我可能會說的建議 - 如果沒有適當的值,請在表中存儲null

INSERT INTO Patient_Study(Radiologist,Technician)VALUES('1','2')
INSERT INTO Patient_Study(Radiologist,Technician)VALUES('1','')
INSERT INTO Patient_Study(Radiologist,Technician)VALUES(null,'2')

檢查這個小提琴

代碼:

SELECT   * 
FROM     Patient_Study
INNER JOIN Users_Reg
         ON CASE 
                WHEN Patient_Study.Radiologist = '' 
                THEN Patient_Study.Technician 
                ELSE Patient_Study.Radiologist 
            END = Users_Reg.User_ID;

如果你把它變成NULL而不是“”(我更喜歡)

SELECT   * 
FROM     Patient_Study
INNER JOIN Users_Reg
         ON COALESCE(Patient_Study.Radiologist,Patient_Study.Technician) = Users_Reg.User_ID

我選擇COALESCE而不是ISNULL,因為你可以在那里添加其他技術人員。

這個怎么樣。

select *,'Radiologist' as StudiedBy from Patient_Study
inner join Users_Reg
on Users_Reg.User_ID=Patient_Study.Radiologist
and Patient_Study.Radiologist>0
Union
select *,'Technician' from Patient_Study
inner join Users_Reg
on Users_Reg.User_ID=Patient_Study.Technician 
and Patient_Study.Technician >0

我添加了一個標記StudiedBy來區分放射科醫生和Techinician。 您可以添加where條件來檢查特定的User_Reg

select R.Name as TechnicianName,T.Name as RadiologistName 
from Patient_Study
inner join Users_Reg R
on Patient_Study.UID=R.User_ID

inner join Users_Reg T
on Patient_Study.UID=T.User_ID.

看到

http://sqlfiddle.com/#!3/25d42/41

暫無
暫無

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

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