当比较返回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;
$$;
答案 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 ,那么你就找到了罪魁祸首。