SQL like语句问题和PATINDEX

1.这两句有啥区别,我是在postgresql里,发现一模一样....

select * from articles where link like '%'||'a'||'%';
select * from articles where link like '%a%';

2.另外 如果我有list = ['a','b','c']

select * from articles where link like '%'||'a'||'%' and link like     '%'||'b'||'%' and link like '%'||'c'||'%';

如何简化上面这一句呢?python or in SQL.

3.我看了这篇文章,了解了PATINDEX,但是在postgresql里并不能执行,为啥提示不存在patindex
有没有人可以讲解一下patindex是啥。

SELECT * from articles where patindex('%a%',site) > 0;
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
Query failed

学生,新手。
十分感谢!

阅读 5.5k
4 个回答

如果用字符匹配功能,要求字符串同时含有a,b,c,除了像你那样用 and 连接 like 也想不出什么其他好办法。如果把字符串打散成一个array,转而判断集合的包含关系,可以这样:

select * from (values('cabbage'), ('black'), ('sblunc')) as articles(link)
where array['a','b','c'] <@ regexp_split_to_array(link, E'\\s*');
  link
---------
 cabbage
 black
(2 行记录)

你说的 patindex 和 charindex 在 SQL Server里有,其他的sql这些函数可能有替代的,具体不是很清楚。

like '%a%'是要作大死的节奏呀,这子句严重影响执行效率,目测你是想把link包含有字符串'a'的都选择出来,那你应该用下面这句。

select * from `articles` where position('a' in `link`);
  1. 没区别,||是postgresql的拼接符,'a'||'b'拼起来就是'ab'。

  2. Python没用过,不知道,有个list你到底是想同时满足list里所有元素还是满足任一即可?你这SQL用and连接可是要满足所有的,如果是满足任一一个,可以用or,也可以用in,但是like和in的效率问题你自己得试试。

  3. patindex就是查第一个参数在第二个参数的什么位置,返回位置号,不过这是SQL Server专用的,在postgresql里可以用strpos(string, substring)代替。
    另外注意两点,第一,like避免在开头使用%匹配,否则效率很慢,第二,尽量在where里用到的字段上建索引,加快匹配速度。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题