0

我一直在查看“MySQL”和“CONCAT_WS”的所有其他提及,但它们并没有解决我的问题。我在 MySQL (5.5.6x) 中建立了一个医学数据库,其中包含 180 个表和数千个字段。数据库表和表单的处理是通过一个大型 PHP 应用程序完成的。

我的 SQL 查询的一部分是以下代码:

    CONCAT_WS(""
        , COALESCE(CASE WHEN op.OP5Begleiteingriff1 = "2" THEN "Cholezystektomie  " ELSE CONCAT("", "") END, "NULL")
        , COALESCE(CASE WHEN op.OP5Begleiteingriff2 = "2" THEN "Appendektomie  " ELSE CONCAT("", "") END, "NULL")
        , COALESCE(CASE WHEN op.OP5Begleiteingriff3 = "2" THEN "Adhäsiolyse  " ELSE CONCAT("", "") END, "NULL")
        , COALESCE(CASE WHEN op.OP5Begleiteingriff4 = "2" THEN "Antrum-Resektion  " ELSE CONCAT("", "") END, "NULL")
        , COALESCE(CASE WHEN op.OP5Begleiteingriff5 = "2" THEN "Hiatoplastie  " ELSE CONCAT("", "") END, "NULL")
        , COALESCE(CASE WHEN op.OP5Begleiteingriff6 = "2" THEN "Hernien-Reparatur  " ELSE CONCAT("", "") END, "NULL")
        , COALESCE(CASE WHEN op.OP5Begleiteingriff7 = "2" THEN "Band-Entfernung  " ELSE CONCAT("", "") END, "NULL")
        , COALESCE(CASE WHEN op.OP5Begleiteingriff8 = "2" THEN "Fundus-Resektion  " ELSE CONCAT("", "") END, "NULL")
        , COALESCE(CASE WHEN op.OP5Begleiteingriff9 = "2" THEN "Rest-Gastrektomie  " ELSE CONCAT("", "") END, "NULL")
        , COALESCE(CASE WHEN op.OP5Begleiteingriff10 = "2" THEN "Leber-Biopsie  " ELSE CONCAT("", "") END, "NULL")
        , COALESCE(CASE WHEN op.OP5Begleiteingriff99 = "2" THEN "Andere Begleiteingriffe" ELSE CONCAT("", "") END, "NULL")
        ) AS "Begleiteingriffe (OP 5)",

这表示字段的内容提取

    op.OP5Begleiteingriffx = "2"

= "2"表示已单击相应的复选框)从 x 等于 -1 到 -10 或 -99。

现在,我想将结果的显示限制为那些非空的字段。

有没有一种优雅的方法可以在短时间内做到这一点?

到目前为止,我已经实现了这样的东西:

    FROM dat_patient p
    LEFT OUTER JOIN dat_optherapie op ON op.patID = p.ID
    LEFT OUTER JOIN users_benutzer ub ON ub.ID = p.UserID

    WHERE op.OP1Datum BETWEEN "1950-01-01" AND "2050-12-31"
    AND (
        "Begleiteingriffe (OP 1)" != "" OR "Begleiteingriffe (OP 2)" != "" OR "Begleiteingriffe (OP 3)" != "" OR "Begleiteingriffe (OP 4)" != "" OR "Begleiteingriffe (OP 5)" != ""
        )
    ORDER BY p.Nachname, p.Vorname, p.Gebdatum; ';

它仍然提供所有结果并且不会省略空字段:

绿色箭头表示正在显示 op.OP5Begleiteingriffx 的列

是否有可能以这种方式处理它,还是我需要为每个

    op.OP5Begleiteingriffx

就像上面提到的那样AND ...

4

2 回答 2

1

自己的解决方案:

关于使用它不起作用

    "Begleiteingriffe (OP 1)" != ""

或者

    "Begleiteingriffe (OP 1)" IS NOT NULL

但是当每一种可能性都被这样处理时才有效

    WHERE (
        op.OP1Begleiteingriff1 = "2" OR
        op.OP1Begleiteingriff2 = "2" OR
        op.OP1Begleiteingriff3 = "2" OR
        op.OP1Begleiteingriff4 = "2" OR
        op.OP1Begleiteingriff5 = "2" OR
        op.OP1Begleiteingriff6 = "2" OR
        op.OP1Begleiteingriff7 = "2" OR
        op.OP1Begleiteingriff8 = "2" OR
        op.OP1Begleiteingriff9 = "2" OR
        op.OP1Begleiteingriff10 = "2" OR
        op.OP1Begleiteingriff99 = "2"
    )

现在,我只得到没有更多空字段的显示结果:

绿色箭头现在仅显示具有非空字段的同一列

于 2020-06-22T14:40:29.530 回答
1

我认为,与其做一堆ORin WHERE,不如尝试使用HAVING. 大概是这样的:

SELECT  ....
       .....
FROM dat_patient p
    LEFT OUTER JOIN dat_optherapie op ON op.patID = p.ID
    LEFT OUTER JOIN users_benutzer ub ON ub.ID = p.UserID

    WHERE op.OP1Datum BETWEEN "1950-01-01" AND "2050-12-31"
--remove this part
/*    AND (
        "Begleiteingriffe (OP 1)" != "" OR "Begleiteingriffe (OP 2)" != "" OR "Begleiteingriffe (OP 3)" != "" OR "Begleiteingriffe (OP 4)" != "" OR "Begleiteingriffe (OP 5)" != ""     ) */
-- add HAVING here
HAVING "Begleiteingriffe (OP 1)" <> ""
    ORDER BY p.Nachname, p.Vorname, p.Gebdatum; ';

试试这是否可行。

于 2020-06-23T06:48:34.250 回答