MySQL CONCAT_WS 来自许多变量 - 如何将查询限制为仅现有数据?

MySQL CONCAT_WS from many variables - how can I limit the query to merely existing data?

我一直在查看所有其他提到的“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

就像上面提到的 AND ... 声明?

自己的解决方案:

使用

无效
    "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"
    )

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

我认为,与其在 WHERE 中做一堆 OR,不如尝试使用 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; ';

尝试一下是否可行。