SQL在多个列中搜索某些值

时间:2019-03-26 18:38:01

标签: sql sql-server

我有一个如下所示的诊断表(只是一个例子),如下所示有50个ICD10列。

+----+-------------+------+----------------+------+-----+------+-------+--------------+-------+
| ID | ICD10_Diag1 | POA1 | ICD10_Diag2    | POA2 | ... | .... | POA49 | ICD10_Diag50 | POA50 |
+----+-------------+------+----------------+------+-----+------+-------+--------------+-------+
| 1  | A234 - Flu  | Y    | B456 - Cough   | Y    |     |      | N     | A844 - Fever | N     |
+----+-------------+------+----------------+------+-----+------+-------+--------------+-------+
| 2  | A563 - Cold | Y    | I567 - Cardiac | Y    |     |      |       |              |       |
+----+-------------+------+----------------+------+-----+------+-------+--------------+-------+
| 3  | C354 - CHF  | N    |                |      |     |      |       |              |       |
+----+-------------+------+----------------+------+-----+------+-------+--------------+-------+

我试图查看如何转置此表结构,以便可以执行以下操作。

查找包含这些诊断代码(A234,F384,I567)且其对应的POA为“ Y”的记录。即使找到单个匹配项,然后即使存在匹配项,也忽略其余的诊断。

SQL

Select * from myTable WHERE ('%A234%', '%F384%', '%I567%') IN (ICD10_Diag1, ICD10_Diag2, ICD10_Diag3, ICD10_Diag4)

我知道这不是正确的方法,我正在寻找替代方法

所需结果

1 A234-Flu 
2 I567 - Cardiac

1 个答案:

答案 0 :(得分:0)

我建议取消数据透视。您可以使用apply在查询中执行此操作,但最好像这样构造数据:

select d.*
from diagnosis d cross apply
     (values (d.ICD10_Diag1, d.POA1),
             (d.ICD10_Diag2, d.POA2),
             . . . 
     ) v(ICD10_Diag, POA)
where v.ICD10_Diag in ('A234', 'F384', 'I567') 
      v.POA = 'Y';

请注意,这可能会返回重复项。一个简单的解决方案是select distinct