【问题标题】:Assigning Each Like Statement A Value That Is Returned On Matching为每个 Like 语句分配一个匹配时返回的值
【发布时间】:2011-10-16 23:27:21
【问题描述】:

我有一个由单词组成的字符串数组(例如 { alpha, beta, gamma } )和一个用单词填充的 MySQL 表。对于每个字符串数组,我提出了一个查询 MySQL 表的 SELECT 语句,以查看是否有任何匹配的单词。返回的行让我知道我的字符串数组中的单词何时是表中唯一的单词之一。然后我更改字符串数组中特定字符串的文本。为简单起见,假设我想在其上调用 .ToUpper()。

我目前的方法是从表中获取所有匹配的行,然后遍历字符串数组并检查返回的每一行是否与数组中的每个字符串匹配。这是非常低效的,我宁愿让我的 MySQL 查询返回的行有一个列,告诉我该单词来自字符串数组中的哪个位置。这样我就可以跳到那里并摆弄绳子。有没有办法给 where 语句中的每个“LIKE”子句一个唯一标识符,如果该特定的 like 子句是匹配的,则返回该标识符?任何想法将不胜感激。

我的选择语句是:

SELECT `WordText` FROM `Words` WHERE `WordText` LIKE 'alpha%' OR `WordText` LIKE 'gamma%';

我正在寻找的是这样的:

SELECT `WordText`, PositionInArray FROM `Words` WHERE `WordText` LIKE 'alpha%' (IF MATCH THEN PositionInArray=0 -- alpha's position in my array) OR  `WordText` LIKE 'gamma%' (IF MATCH THEN PositionInArray=2 - gamma's position in my array);

当返回这一行时,我可以直接转到 WordArray[PositionInArray].ToUpper() 并知道那是匹配的单词。

非常感谢!

【问题讨论】:

    标签: mysql sql if-statement where-clause string-matching


    【解决方案1】:
    SELECT CASE WHEN WordText LIKE 'alpha%' THEN 0 WHEN WordText LIKE 'beta%' THEN 1
    WHEN 'gamma%' THEN 2 ELSE -1 END AS match FROM Words WHERE match <> -1
    

    【讨论】:

    • 谢谢——这似乎是正确的方法,但如果我搜索单词“alpha”两次并给它两个键(因为它在我的单词数组中出现两次),它只会出现在结果中上升一次。有什么建议吗?
    • 我建议您在应用程序中处理多个匹配案例,而不是在 MySql 中。首先从列表中删除重复项,进行查询,当结果回来时再次检查原始列表,看看列表中是否有多个元素的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    相关资源
    最近更新 更多