gpt4 book ai didi

sql - 如何从 Oracle 表中获取几乎匹配的字符串?

转载 作者:行者123 更新时间:2023-12-05 00:22:25 24 4
gpt4 key购买 nike

我在 Oracle 中有一个包含四列的表。
Table Data in Oracle.

现在用户可以在我的查询中输入输入字符串作为“operation Knee right”(这是有效的),我的查询应该返回与 DiagnosisName 列中的大部分单词匹配的 ICD 代码 (IKR123)。

以下是我当前的查询。(没有给出正确的输出)

SELECT diagnosisname
FROM
(SELECT diagnosisname,
UTL_MATCH.jaro_winkler_similarity('%operation Knee right%',diagnosisname)
FROM icd_code
ORDER BY UTL_MATCH.EDIT_DISTANCE_SIMILARITY('%operation Knee right%',diagnosisname) DESC
)
WHERE ROWNUM<2;

这个查询给我的输出是“左膝操作”,但我的期望是“右膝操作”。

最佳答案

关于您使用 UTL_MATCH 的一些注意事项:

  • EDIT_DISTANCE_SIMILARITY :返回 0 到 100 之间的整数,其中 0 表示完全没有相似性,100 表示完全匹配。
  • JARO_WINKLER_SIMILARITY :返回 0 到 100 之间的整数,其中 0 表示根本没有相似性,100 表示完全匹配,但会尝试考虑可能的数据输入错误。

  • ORDER BY UTL_MATCH.EDIT_DISTANCE_SIMILARITY('%operation Knee right%',diagnosisname) DESC



    这不会给你正确的结果。因为,您只考虑了可能的相似性,而没有考虑数据输入错误。所以,你必须使用 JARO_WINKLER_SIMILARITY .

    operation Knee right



    您需要记住 案例 要比较的输入值和列值。它们必须在相似的情况下才能正确匹配。您正在传递 中的输入小写 ,但是,您的列值在 中INITCAP .更好地将列值和输入都转换为类似的情况。

    下面一起来看看 演示理解:
    SQL> WITH DATA AS(
    2 SELECT 'Heart Operation' diagnosis_name, 'IH123' icd_code FROM dual UNION ALL
    3 SELECT 'Knee Operation' diagnosis_name, 'IK123' icd_code FROM dual UNION ALL
    4 SELECT 'Left Knee Operation' diagnosis_name, 'IKL123' icd_code FROM dual UNION ALL
    5 SELECT 'Right Knee Operation' diagnosis_name, 'IKR123' icd_code FROM dual UNION ALL
    6 SELECT 'Fever' diagnosis_name, 'IF123' icd_code FROM dual
    7 )
    8 SELECT t.*,
    9 utl_match.edit_distance_similarity(upper(diagnosis_name),upper('operation Knee right')) eds,
    10 UTL_MATCH.jaro_winkler_similarity (upper(diagnosis_name),upper('operation Knee right')) jws
    11 FROM DATA t
    12 ORDER BY jws DESC
    13 /

    DIAGNOSIS_NAME ICD_CO EDS JWS
    -------------------- ------ ---------- ----------
    Right Knee Operation IKR123 20 72
    Knee Operation IK123 20 70
    Heart Operation IH123 25 68
    Left Knee Operation IKL123 25 64
    Fever IF123 15 47

    SQL>

    因此,您会看到两者有何不同。 jaro_winkler_similarity 在识别 方面做得更好数据输入错误 并给予 最接近的比赛 .基于此,只需在按降序排序后选择第一行:
    SQL> WITH DATA AS(
    2 SELECT 'Heart Operation' diagnosis_name, 'IH123' icd_code FROM dual UNION ALL
    3 SELECT 'Knee Operation' diagnosis_name, 'IK123' icd_code FROM dual UNION ALL
    4 SELECT 'Left Knee Operation' diagnosis_name, 'IKL123' icd_code FROM dual UNION ALL
    5 SELECT 'Right Knee Operation' diagnosis_name, 'IKR123' icd_code FROM dual UNION ALL
    6 SELECT 'Fever' diagnosis_name, 'IF123' icd_code FROM dual
    7 )
    8 SELECT diagnosis_name
    9 FROM
    10 (SELECT t.*,
    11 utl_match.edit_distance_similarity(upper(diagnosis_name),upper('operation Knee right')) eds,
    12 UTL_MATCH.jaro_winkler_similarity (upper(diagnosis_name),upper('operation Knee right')) jws
    13 FROM DATA t
    14 ORDER BY jws DESC
    15 )
    16 WHERE rownum = 1
    17 /

    DIAGNOSIS_NAME
    --------------------
    Right Knee Operation

    SQL>

    关于sql - 如何从 Oracle 表中获取几乎匹配的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29935017/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com