Postgresql'%'影响LIKE比较

时间:2017-11-14 19:53:24

标签: string postgresql wildcard

当比较返回TEXT的函数的结果时,LIKE '%word'LIKE 'word%'将产生匹配,但不会产生LIKE 'word'

SELECT extract_json_text(lst_logs.data) AS machine
   FROM lst_logs WHERE extract_json_text(lst_logs.data) LIKE 'Cupra';

给我没有结果,但

SELECT extract_json_text(lst_logs.data) AS machine
       FROM lst_logs WHERE extract_json_text(lst_logs.data) LIKE '%Cupra';

甚至

SELECT extract_json_text(lst_logs.data) AS machine
       FROM lst_logs WHERE extract_json_text(lst_logs.data) LIKE 'Cupra%';

给我我想要的东西,但我的结果是文字是Cupra

%如何能够从字符串的任何一侧影响匹配?

编辑这是提取文本的功能。 JSON中有一些转义引号,我使用TRIM。

CREATE OR REPLACE FUNCTION cupra.lst_machine(jsonb)
  RETURNS text
IMMUTABLE
LANGUAGE plpgsql
AS $$
BEGIN
  RETURN (TRIM(BOTH '\"' FROM $1->>5));
END;
$$;

1 个答案:

答案 0 :(得分:0)

由于LIKE的工作原理。

%是一个通配符匹配。

陈述LIKE 'word'相当于陈述= 'word';那是说,"寻找'字'确切地说'字'作为该领域的全部内容。"但是,LIKE在该实例中比=慢。

在混合中添加%会导致LIKE找到'字'字符串中的任何位置。它并不关心放置%的哪一方。

要了解前面的内容,您可以通过以下方式获取代码点:

SELECT ascii(extract_json_text(lst_logs.data)) AS first_char_code_point
  FROM lst_logs WHERE extract_json_text(lst_logs.data) LIKE 'Cupra%' LIMIT 1;

ascii()只返回第一个字符的代码点。如果它不是 67 ,那么你就找到了罪魁祸首。

对于最后一个字符,以下应该可以解决问题:

SELECT ascii(substr(extract_json_text(lst_logs.data),
       length(extract_json_text(lst_logs.data))) AS last_char_code_point
  FROM lst_logs WHERE extract_json_text(lst_logs.data) LIKE 'Cupra%' LIMIT 1;

如果它不是 97 ,那么你就找到了罪魁祸首。