查询以返回表中多个列的查找值

  • 本文关键字:查找 返回 查询 sql sql-server
  • 更新时间 :
  • 英文 :


我必须查询旧版MySQL数据库并将结果导出为CSV文件。它位于一个相对锁定的系统上,因此解决方案必须仅为 SQL。

有问题的表dbo.NGSVariantACMG有23个字段,每个字段与称为PVS1,PS1,PS2等的证据类别有关。 这些字段中的每一个都接受null、'3366'、'3367'、'3368' 或 '3369' 的值,这些值对每一行该类别中的证据强度进行评级。 这些值分别链接到人类可读的描述,"非常强"、"强"、"中等"、"支持",可以在另一个名为item的表中查找,该表已成为许多不同查找值的垃圾场。

数据示例:

空'2'3368''3 空'3369''
PersonID PVS1 PS1 PS2 ...
1 3367'...
3366'...
3369'...

您需要按照以下步骤操作,以避免代码重复。它将使您的查询变得优雅。

  1. 创建标量用户定义函数,该函数返回状态的描述性数据
CREATE FUNCTION dbo.ufnGetStatusDescription(@StatusID CHAR(4))  
RETURNS VARCHAR(30)
AS   
-- Returns the stock level for the product.  
BEGIN  
DECLARE @ret VARCHAR(30);  
SELECT @ret = CASE @StatusID
WHEN '3366' THEN 'Very Strong'
WHEN '3367' THEN 'Strong'
WHEN '3368' THEN 'Moderate'
WHEN '3369' THEN 'Supporting'
END ;  
RETURN @ret;  
END; 
  1. 现在,您需要在 SELECT 子句中使用此标量 UDF。
SELECT dbo.NGSVariant.NGSVariantID, dbo.NGSVariant.DateAdded, dbo.NGSVariant.ChrID, dbo.NGSVariant.Position_hg19, 
dbo.NGSVariant.ref, dbo.NGSVariant.alt, dbo.Status.Status AS 'ACMG_Class',
dbo.ufnGetStatusDescription(PVS1) AS PVS1,
dbo.ufnGetStatusDescription(PVS2) AS PVS2,
.
.
.
dbo.ufnGetStatusDescription(PVS23) AS PVS23 
FROM dbo.NGSVariant 
LEFT JOIN dbo.Status 
ON dbo.NGSVariant.Classification = dbo.Status.StatusID 
LEFT JOIN dbo.NGSVariantACMG
ON dbo.NGSVariant.NGSVariantID = dbo.NGSVariantACMG.NGSVariantACMGID
WHERE Classification = 1202218788 OR Classification = 1202218783 OR Classification = 1202218781

由于有一个查找表(项目),你应该使用它。大致如下:

select
personid,
item_pvs1.value as pvs1_value,
item_ps1.value as ps1_value,
item_ps2.value as ps2_value,
...
from mytable
left join item item_pvs1 on item_pvs1.key = mytable.pvs1
left join item item_ps1 on item_ps1.key = mytable.ps1
left join item item_ps2 on item_ps2.key = mytable.ps2
...

最新更新