【问题标题】:What is the JavaScript equivalent of MySQL's %LIKE% clause?MySQL 的 %LIKE% 子句的 JavaScript 等价物是什么?
【发布时间】:2011-11-28 18:46:33
【问题描述】:

在 MySQL 中我使用 like 子句:

LIKE %some keyword% 

对数据库记录执行搜索。我可以使用什么来类似地在 JavaScript 中进行搜索?因此,如果用户输入类似

ger

它会显示

german shepard

不能使用:

str.search('ger');

因为它似乎只匹配整个单词

【问题讨论】:

    标签: javascript mysql


    【解决方案1】:

    它与%LIKE% 不完全相同,但您可以使用indexOf()

    var str = "Mohsen",
        st = "Moh";
    
    if(str.indexOf(st) > -1) // true
    

    【讨论】:

    • 您的插入符号向后。 > 不是 <
    • 天才:D...啊,我讨厌最小评论长度
    • 你抓住我!啊,我讨厌最小评论长度
    • 与 like 相比,这没什么,因为您不区分大小写,而且像 ç -> c 或 à -> a .. 这样的字符转置也不起作用。
    【解决方案2】:

    我不确定您在什么上下文中使用 like 运算符(例如表单字段),但您可能想利用 javascript 的正则表达式对象。

    一个简单的例子(在你的例子中,对于LIKE 查询),可能看起来像这样:

    var regex = /.*ger.*/
    var matchesRegex = regex.test(yourString);
    if (matchesRegex) {
        //do something
    }
    

    或者,您可以使用 indexOf 操作搜索字符串的出现次数:

    var matches = yourString.indexOf("ger") >= 0 ? true : false;
    if (matches) {
        //do something
    }
    

    【讨论】:

    • 给定某些输入可能很容易弄乱正则表达式
    • @Shredder:你是对的。我不知道为什么这是我想到的第一个解决方案。同时,正则表达式可以允许其他类似于 SQL 语法的事情,而您无法使用 indexOf 或其他字符串操作。
    【解决方案3】:

    search 函数不仅返回整个单词。也许你对它返回从零开始的索引感到困惑,所以......

    // this returns 0 as positive match at position 0
    "german shepherd".search('ger')
    
    // this returns -1 as negative match
    "german shepherd".search('gerx')
    

    因此,您需要将搜索结果与 -1 进行比较以查看它是否匹配 - 您不能只检查真/假。

    所以你可以这样做......

    if(str.search('ger') !== -1){
        // matches string
    } else {
        // does not match string
    }
    
    // or another way
    // add one to convert result to one-based index, and check truthiness
    if(str.search('ger')+1){
        // there is a match
    } else {
        // there is not a match
    }
    

    【讨论】:

      【解决方案4】:

      假设您有一堆记录作为字符串数组,您可以使用JavaScript built-in Array.filter method

      var ss = ['german shepard', 'labrador', 'chihuahua'];
      var matches = ss.filter(function(s) {
        return s.match(/ger/);
      });
      matches; //output => ['german shepard']
      

      或者,如果您的目标 JavaScript 没有实现该方法(例如,它实现了 ECMAScript 第 5 版之前的版本),那么您可以进行简单的数组搜索,例如:

      var searchArray = function(arr, regex) {
        var matches=[], i;
        for (i=0; i<arr.length; i++) {
          if (arr[i].match(regex)) matches.push(arr[i]);
        }
        return matches;
      };
      searchArray(ss, /h/); //output => ['german shepard', 'chihuahua']
      

      【讨论】:

        【解决方案5】:

        我假设你有来自数据库的数据让我们说它就像

        let names = ['yusuf', 'sabri', 'bayrakdar'];
        

        您应该在filter 中使用includes

        let searchValue = 'usu'
        let filteredNames = names.filter(name => name.includes(searchValue));
        

        filteredNames 将是 ["yusuf"]

        【讨论】:

          【解决方案6】:

          我不确定是否所有浏览器都支持所有这些方法:http://www.javascriptkit.com/jsref/string.shtml

          但看起来有一个String.match() 方法可以满足您的需求。

          【讨论】:

            【解决方案7】:

            这是在 JQuery 中执行此操作的简单方法。

            这通过表格行上的数据过滤器对表格内的文本数据进行过滤,但它可以很容易地用于其他目的。

            $('#search').on('keyup', function() {
                var val = $.trim(this.value);
                if (val) {
                    $('tr[data-filter!=' + val + ']').hide();
                    $('tr[data-filter^=' + val + ']').show();
                } else {
                   $('tr[data-filter]').show();
                }
            });
            

            在此示例中,它将隐藏未找到完全匹配的所有表行,然后按字符串值的开头进行过滤。 trim() 函数在所有内容都是空白的情况下很有用,然后它仍然会显示所有内容,就好像从未进行过搜索一样。如果您希望它在字符串中的任何位置显示搜索到的输入,请使用 * 而不是 ^。这两个特殊字符都区分大小写。还要确保首先显示隐藏命令并且两者都存在,否则它将无法正常工作。

            在此处查看另一个同时使用 ^ 和 * 字符的示例: http://jsfiddle.net/heatwaveo8/2VKae/

            【讨论】:

              【解决方案8】:

              我的代码:

              // file name 1 = "E_000096_01.jpg"
              // file name 2 = "E_000096_02.jpg"
              // file name 3 = "E_000096_03.jpg"
              // file name 4 = "E_000095_01.jpg"
              var code = "000096";
              var files = fs.readdirSync(dir).filter(file => file.indexOf(code) >= 0 ? true : false)
              // result
              console.log(files)
              //["E_000096_01.jpg","E_000096_02.jpg","E_000096_03.jpg"]
              

              【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-20
              • 1970-01-01
              • 1970-01-01
              • 2017-12-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多