关于在mysql数据库表中以逗号分隔的方式保存基于字符串的结果有很多讨论。我不想在这里用我自己的哲学评论来扩展这一点,我只想说,这个问题是我所熟知的,但不是现在的主题。
题目是我有这样的情况要评估。数据保存为基于字符串的密码。这些密码中的每一个都表示特定类型的手术后的医疗并发症。
例子:
mysql数据库表“complements”包含一个名为“indication for surgical revision”(varchar[50])的字段,其中保存了诸如“3、7、9、16”之类的数据项,因为这4个不同的适应症是由用户从多个选择菜单中选择的。
现在我想做以下工作:
我知道“3”、“7”、“9”和“16”代表什么。我想使用mysql select查询将这些密码重新显示为它们的原始概念(如“体重恢复”、“体重减轻失败”等),例如:
SELECT blah blah blah (a lot of other stuff),
CONCAT_WS(", "
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%1%" THEN "Innere Hernie (Meso) " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%2%" THEN "Innere Hernie (PETERSEN) " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%3%" THEN "Weight Regain " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%4%" THEN "Weight Loss Failure " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%5%" THEN "Anastomosenstenose " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%6%" THEN "Dysphagie " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%7%" THEN "Reflux " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%8%" THEN "Gallenreflux " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%9%" THEN "Malnutrition " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%10%" THEN "Diarrhö " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%11%" THEN "Gastrogastrale Fistel" ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%12%" THEN "Ulcusperforation " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%13%" THEN "Chronische Ulcus " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%14%" THEN "Chronische Schmerzen " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%15%" THEN "Ileus " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%16%" THEN "Choledocholithiasis nach Magen-Bypass " ELSE CONCAT("", "") END, "NULL")
, COALESCE(CASE WHEN op.OP2RevisionIndikation LIKE "%17%" THEN "Leakage " ELSE CONCAT("", "") END, "NULL")
) AS "Indikation zur Revision",
现在你可能会问“为什么这个家伙如此间接?”或者“他为什么不使用php呢?”。我是用php来做的,但是在一个不同的上下文中。在这里,我需要使用sql查询进行直接计算,因为在这段代码中,并非我所说的所有数据都被提取出来,以便在excel csv文件中自动创建要进行二次处理的结果集—我不想重新发明轮子。
现在,上面提到的查询并不是我想要它做的。在我的例子中,我想从这个“3,7,9,16”字符串中显示“体重恢复,反流,营养不良,胆总管结石nach-magen旁路”。
我知道一个事实。。。例如“%3%”。。。在这里不起作用。
有一些使用“find_in_set('3',op.op2revisionindikation)”的建议,但这里我们不是直接在主select语句中,而是在then else使用coalesce和concat_ws结束过程的情况下。
你们中有人知道如何通过将字符串“3,7,9,16”Map到原始值并让mysql以这种方式显示它来正确地计算它吗?
我希望我已经足够透彻和充分理解。
致以最诚挚的问候,无限感谢您的帮助
马库斯
3条答案
按热度按时间igsr9ssn1#
在更一般的情况下,当目标是将逗号分隔的正整数值列表“转换”为相应字符串列表时,顺序与原始值列表相同,并且不引入无关的“逗号”和空格。。。
我们可以用一种可怕的表情来达到这个目的。
作为示范。
退货
注意事项:
每个
ELT
行是一个完全相同的副本,除了一个整数基本上指定了要提取的逗号分隔的整数列表的第n个元素,即第1个、第4个、第5个等等。表达式只处理列表中的有限个元素;每个元素都需要一个单独的elt表达式。该示例最多可以处理逗号分隔列表中的20个元素;这可以扩展到处理更多的元素。
这只适用于以逗号分隔的正整数值列表。逗号之间的每个值都将作为整数计算。这意味着一个元素
'x17'
将评估为0
. 元素'-6.2'
将评估为-6
. 要素'007jamesbond'
将评估为7
. 等等。求值中的整数值用作索引,以便从中的字符串列表中“查找”字符串
ELT
功能。计算为与列表中的字符串不对应的整数值的元素(例如。
0
,-6
)被忽略,就好像元素不在原始列表中一样。示例中返回的最后两行演示了逗号分隔列表的行为,我们可能认为这些列表格式不正确。翻译表达式是“尽力而为”,它返回可以翻译的内容。当逗号分隔的列表格式不正确时,表达式不会引发错误,也不会返回null或空字符串。
6jjcrrmo2#
啊哈,尼克的最后一句话很有意思:
结果显示在此屏幕截图中:
现在唯一要做的就是一个好的格式化(去掉逗号和空格等)。
问题解决了。
ltskdhd13#
谢谢你的回答。
在集合中查找解决方案。。。
... 能够识别单个项目。但它不处理逗号:
从“3,7,9,16”中可以正确识别“3”,但其余的一点也不正确,因此我只显示了这些项目中的第一个: