我必须查询旧版MySQL数据库并将结果导出为CSV文件。它位于一个相对锁定的系统上,因此解决方案必须仅为 SQL。
有问题的表dbo.NGSVariantACMG
有23个字段,每个字段与称为PVS1,PS1,PS2等的证据类别有关。 这些字段中的每一个都接受null
、'3366'、'3367'、'3368' 或 '3369' 的值,这些值对每一行该类别中的证据强度进行评级。 这些值分别链接到人类可读的描述,"非常强"、"强"、"中等"、"支持",可以在另一个名为item
的表中查找,该表已成为许多不同查找值的垃圾场。
数据示例:
PersonID | PVS1 | PS1 PS2 | ... | |
---|---|---|---|---|
1 | 空 | 空' | 3367' | ... |
2'3368'' | 3366' | 空 | ... | |
3369 | ' | ... |
您需要按照以下步骤操作,以避免代码重复。它将使您的查询变得优雅。
- 创建标量用户定义函数,该函数返回状态的描述性数据
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;
- 现在,您需要在 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
...