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; ';
尝试一下是否可行。
我一直在查看所有其他提到的“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; ';
尝试一下是否可行。