如何检测 Snowflake VARCHAR 中的表情符号?

Tee*_*eej 6 javascript regex sql emoji snowflake-cloud-data-platform

我有一个 1B 行的聊天消息表,其中有一个用于原始消息文本的最大大小的 VARCHAR 列。我如何 -

  1. 仅选择包含 1 个或多个表情符号字符的行
  2. 有效过滤掉没有表情符号的行(如果需要提高性能)

Fel*_*ffa 5

结合 Lukasz 和 Greg 分享的知识,再加上发现一个额外的隐藏角色,我可以提出这个解决方案:

\n
    \n
  • 1 检测表情符号是否存在的 JS UDF。
  • \n
  • 1 JS UDF 检测字符串是否仅为表情符号。
  • \n
\n
create or replace function has_emoji(X text)\nreturns boolean\nlanguage javascript\nas $$\nreturn /\\p{Extended_Pictographic}/u.test(X);\n$$;\n\ncreate or replace function only_emoji(X text)\nreturns boolean\nlanguage javascript\nas $$\nreturn /^[\\p{Extended_Pictographic}\\p{Emoji_Component}]+$/u.test(X);\n$$;\n
Run Code Online (Sandbox Code Playgroud)\n

使用示例:

\n
with data as (\n  select $1 t\n  from values(\'\xe2\x9d\x84\xef\xb8\x8f\'),(\'\xe2\x9d\x84\xef\xb8\x8f is the data \xe2\x98\x81\xef\xb8\x8f\'),(\'no emoji\')\n)\n\nselect *, has_emoji(t), only_emoji(t)\nfrom data\n;\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

--

\n

一些研究:

\n
    \n
  • \'\xe2\x9d\x84\xef\xb8\x8f\'.replace(/\\p{Extended_Pictographic}/ug, \'\')回报\'\'
  • \n
  • \'\xe2\x9d\x84\xef\xb8\x8f\'.replace(/\\p{Extended_Pictographic}/ug, \'\')不等于\'\'
  • \n
  • 原来还有隐藏的字符需要替换,并用Emoji_Component
  • \n
\n

在此输入图像描述

\n


Luk*_*zda 0

使用 Snowflake 的JavaScript 用户定义函数

CREATE OR REPLACE FUNCTION EMOJI_TEST (STR VARCHAR)
  RETURNS VARCHAR
  LANGUAGE JAVASCRIPT
  AS $$
  return (/\p{Emoji}/u.test(STR));
  $$
  ;
Run Code Online (Sandbox Code Playgroud)

询问:

WITH cte(col) AS (
    SELECT ''   UNION ALL
    SELECT 'text' UNION ALL
    SELECT 'text '
)
SELECT col, EMOJI_TEST(col)
FROM cte
-- WHERE EMOJI_TEST(col)::BOOLEAN
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

相关:如何使用 javascript 检测表情符号