Tengo una tabla de filas 1B de mensajes de chat con una columna VARCHAR de tamaño máximo para el texto del mensaje sin procesar. Cómo puedo -
Combinando el conocimiento compartido por Lukasz y Greg, además de descubrir un personaje oculto adicional, puedo presentar esta solución:
create or replace function has_emoji(X text) returns boolean language javascript as $$ return /\p{Extended_Pictographic}/u.test(X); $$; create or replace function only_emoji(X text) returns boolean language javascript as $$ return /^[\p{Extended_Pictographic}\p{Emoji_Component}]+$/u.test(X); $$;Ejemplo de uso:
with data as ( select $1 t from values('❄️'),('❄️ is the data ☁️'),('no emoji') ) select *, has_emoji(t), only_emoji(t) from data ;--
Alguna investigación:
'❄️'.replace(/\p{Extended_Pictographic}/ug, '') devuelve '''❄️'.replace(/\p{Extended_Pictographic}/ug, '') no es igual a ''Emoji_ComponentUso de la función definida por el usuario de JavaScript de Snowflake:
CREATE OR REPLACE FUNCTION EMOJI_TEST (STR VARCHAR) RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$ return (/\p{Emoji}/u.test(STR)); $$ ;Consulta:
WITH cte(col) AS ( SELECT '👌' UNION ALL SELECT 'text' UNION ALL SELECT 'text 🐒' ) SELECT col, EMOJI_TEST(col) FROM cte -- WHERE EMOJI_TEST(col)::BOOLEANProducción:
Relacionado: Cómo detectar emoji usando javascript