Postgresql 的“%”如何影响 LIKE 比较

How does Postgresql's '%' affect a LIKE comparison

当比较 returns 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

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

EDIT 这是提取文本的函数。 JSON 里面有转义引号,我用的是 TRIM.

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

因为 LIKE 的工作方式。

% 是通配符匹配。

声明LIKE 'word'等同于声明= 'word';也就是说,"look for 'word' and exactly 'word' as the entire contents of the field." 但是,LIKE 在这种情况下比 = 慢。

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

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

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() 只会 return 第一个字符的代码点。如果不是 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,那么您找到了罪魁祸首。