JavaScript中与MySQL的%LIKE%子句等效的是什么?

17

在MySQL中我使用like语句:

LIKE %some keyword% 

我想在数据库记录上执行搜索操作。我可以使用什么类似的方法来在 JavaScript 中进行搜索呢?因此,如果用户输入了一些内容

ger

它会显示

german shepard

无法使用:

str.search('ger');

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

8个回答

42

虽然不完全等同于%LIKE%,但你可以使用indexOf()

var str = "Mohsen",
    st = "Moh";

if(str.indexOf(st) > -1) // true

2
你的插入符号是反向的。应该是 > 而不是 < - Wiseguy
2
天才 :D...虽然我讨厌最小注释长度 - Nick Rolando
2
你抓住我了!啊,我讨厌最小注释长度。 - Mohsen
1
不,它是区分大小写的。请参考http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html。 - Mohsen
1
这与实际情况相比微不足道,因为它没有区分大小写,并且字符转换如 ç -> c 或 à -> a.. 不起作用。 - Miguel

8

我不确定你在什么情况下使用了 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
}

3
在特定的输入情况下,可能很容易搞砸正则表达式。 - Nick Rolando
@Shredder:你说得对。我不知道为什么它是我首先想到的解决方案。同时,正则表达式可以允许其他类似于SQL语法的东西,这是您无法使用indexOf或其他字符串操作完成的。 - NT3RP
我认为正则表达式很有前途,您只需要正确转义动态输入!参见帖子 - Richard Tyler Miles

4

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进行比较,以确定它是否匹配,你不能仅仅检查true/false。

因此,你可以这样做...

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
}

3
假设你有一堆记录,作为字符串数组,你可以使用JavaScript内置的Array.filter方法
var ss = ['german shepard', 'labrador', 'chihuahua'];
var matches = ss.filter(function(s) {
  return s.match(/ger/);
});
matches; //output => ['german shepard']

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

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']

1

我假设您有来自数据库的数据,就像这样

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

在编程中,你应该在过滤器中使用includes

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

filteredNames 将会是 ["yusuf"]


0

这里有一个在JQuery中实现的简单方法。

它使用了通过表格行上的data-filter对文本数据进行过滤,但它也可以轻松地用于其他目的。

$('#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/

0

0

我的代码:

// 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"]

帖子应该只用英语发布 - https://meta.stackexchange.com/questions/13676/do-posts-have-to-be-in-english-on-stack-exchange - GrafiCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接