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,那么您找到了罪魁祸首。
当比较 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,那么您找到了罪魁祸首。