-- pasition(haystack, needle), 顯示needle在haystack的第一個出現的位置。
SELECT POSITION('2121stringstrstrstrstr','str') AS positionSearch, -- 5 POSITION('你好,hello,12323-你好,你,好sdfd*dg', '你,好'),-- 31 positionUTF8('n12你好','你好') AS positionUTF8,-- 4 positionCaseInsensitive('ABCDCDEFABCD','bc') AS positionCaseInsensitive, --2 locate('hellohellohellohello','ello'); -- 2
-- multiSearchAllPositions(haystack, [needle1, needle2, ..., needlen])
-- 注意:在所有multiSearch*函數中,由於實現規范,needles的數量應小於2^8。
-- 函數返回一個數組,其中包含所有匹配needlei的位置
SELECT multiSearchAllPositions('goodnamegoodnamegoodhellohihihi', ['dn', 'good']) as multiSearch,-- [4,1] multiSearchAllPositionsCaseInsensitive('nameSsdfagpSSDFDFetgfderef', ['SS','fa']) as multiCaseInsensitive, multiSearchAllPositionsUTF8('nameSsdfazz軸功率gpSSDFDFetgfderef', ['Ss','fa', 'zz軸']) AS multiSearchUTF8, multiSearchAllPositionsCaseInsensitiveUTF8('nameSsdfazz軸功率gpSSDFDFetgfderef', ['Ss','fa', 'zz軸']) AS multiCaseInsensitiveUTF8; -- 檢查字符串是否與pattern正則表達式匹配。pattern可以是一個任意的re2正則表達式。 re2正則表達式的語法比Perl正則表達式的語法存在更多限制。
-- match(haystack, pattern) 匹配到了則返回1,否則返回0
SELECT match('1232434sadgaDDFSrefds', '[0-9a-zA-Z]'), -- 存在匹配的字符,返回1 match('1232321', '[a-z]'); -- 不存在匹配的字符,返回0 -- 與match相同,但如果所有正則表達式都不匹配,則返回0;如果任何模式匹配,則返回1。它使用hyperscan庫。對於在字符串中搜索子字符串的模式,最好使用“multisearchany”,因為它更高效。
-- multiMatchAny(haystack, [pattern1, pattern2, ..., patternn])
-- 注意:任何haystack字符串的長度必須小於232字節,否則拋出異常。這種限制是因為hyperscan API而產生的。
-- 多個正則表達式對原始字符進行匹配,如若只有一個正則表達式匹配上了則返回1,否則返回0
SELECT multiMatchAny('abcABC',['[0-9]','[a-zA-Z]']) AS multiMatchAnyOne, -- 1 multiMatchAny('123abcABC',['[0-9]','[a-zA-Z]']) AS multiMatchAnyTwo, --1 -- 與multiMatchAny相同,但返回與haystack匹配的任何內容的索引位置。 multiMatchAnyIndex('123abcABC', ['[0-9]','[a-zA-Z]']) as multiMatchAnyIndex; --2 -- 模糊匹配:like()函數,注意大寫敏感。 -- % 表示任何字節數(包括零字符) -- _ 表示任何一個字節 SELECT 'hello' LIKE '%h%' as LIKE_UP, -- 1 'hello' like 'he' AS like_low, -- 0 'hello' not like 'he' AS not_like, -- 1 'hello' like '%he%' AS like_litter, -- 1 like('adgadgadfa1232', '_12_') AS like_func, like('sdfasdfasd', '[a-z]') AS like_func2, -- 0 notLike('1232423', '[a-zA-Z]') AS not_like_func; -- 1
-- 使用字符串截取字符串:extract(haystack, pattern)
-- 使用正則表達式截取字符串。如果‘haystack’與‘pattern’不匹配,則返回空字符串。如果正則表達式中不包含子模式,它將獲取與整個正則表達式匹配的子串。否則,它將獲取與第一個子模式匹配的子串。 SELECT extractAll('hellogoodaimantIdeaIDEAfasd123232', '[0-9]'), -- ['1','2','3','2','3','2'] extractAll('12323dSDFRE', '[A-Z]'),-- ['S','D','F','R','E'] extract('helloclickhouse', '[a-z]');-- h
-- ngramSearch(haystack, needle)
-- 基於4-gram計算haystack和needle之間的距離:計算兩個4-gram集合之間的對稱差異,並用它們的基數和對其進行歸一化。 -- 返回0到1之間的任何浮點數 -- 越接近0則表示越多的字符串彼此相似。 -- 如果常量的needle或haystack超過32KB,函數將拋出異常。如果非常量的haystack或needle字符串超過32Kb,則距離始終為1。 SELECT ngramDistance('hello123456789','123') AS ngramDistance, ngramDistanceCaseInsensitive('hello123456789','123') AS ngramDistanceCaseInsensitive, ngramDistanceUTF8('hello123456789','123') AS ngramDistanceUTF8, ngramDistanceCaseInsensitiveUTF8('hello123456789','123') AS ngramDistanceCaseInsensitiveUTF8; -- 注意:對於UTF-8,我們使用3-gram。所有這些都不是完全公平的n-gram距離。 -- 我們使用2字節哈希來散列n-gram,然后計算這些哈希表之間的(非)對稱差異 - 可能會發生沖突。 -- 對於UTF-8不區分大小寫的格式,我們不使用公平的tolower函數 -- 我們將每個Unicode字符字節的第5位(從零開始)和字節的第一位歸零 -- 這適用於拉丁語,主要用於所有西里爾字母。