> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8c05c8a2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> توثيق دوال البحث في السلاسل

# دوال البحث في السلاسل

تُجري جميع الدوال في هذا القسم البحث بشكل حساس لحالة الأحرف افتراضيًا. وعادةً ما تتوفر صيغ دوال منفصلة للبحث غير الحساس لحالة الأحرف.

<Note>
  يتبع البحث غير الحساس لحالة الأحرف قواعد التحويل بين الأحرف الصغيرة والكبيرة في اللغة الإنجليزية. فعلى سبيل المثال، يكون الحرف الكبير لـ `i` في اللغة الإنجليزية هو
  `I`، بينما يكون في اللغة التركية `İ` - لذا قد تكون النتائج غير متوقعة في اللغات غير الإنجليزية.
</Note>

تفترض الدوال في هذا القسم أيضًا أن السلسلة التي يُبحث فيها (ويُشار إليها في هذا القسم باسم `haystack`) وسلسلة البحث (ويُشار إليها في هذا القسم باسم `needle`) نصّان مرمَّزان بترميز أحادي البايت. وإذا لم يتحقق هذا الافتراض،
فلا يُطرَح أي استثناء وتكون النتائج غير معرّفة. وعادةً ما تتوفر صيغ دوال منفصلة للبحث في السلاسل المرمَّزة بـ UTF-8.
وبالمثل، إذا استُخدمت صيغة دالة لـ UTF-8 وكانت سلاسل الإدخال ليست نصًا مرمَّزًا بـ UTF-8، فلا يُطرَح أي استثناء وتكون
النتائج غير معرّفة. لاحظ أيضًا أنه لا يُجرى أي تطبيع تلقائي لـ Unicode، ولكن يمكنك استخدام دوال
[normalizeUTF8\*()](/ar/reference/functions/regular-functions/string-functions#normalizeUTF8NFC) لهذا الغرض.

يُشرح كلٌّ من [الدوال العامة للسلاسل](/ar/reference/functions/regular-functions/string-functions) و[دوال الاستبدال في السلاسل](/ar/reference/functions/regular-functions/string-replace-functions) بشكل منفصل.

<Note>
  التوثيق أدناه مُولَّد من جدول النظام `system.functions`.
</Note>

{/*AUTOGENERATED_START*/}

<div id="countMatches">
  ## countMatches
</div>

أُضيف في: v21.1.0

يعيد عدد مرات تطابق تعبير نمطي داخل سلسلة نصية.

<Info>
  **سلوك يعتمد على الإصدار**

  يعتمد سلوك هذه الدالة على إصدار ClickHouse:

  * في الإصدارات \< v25.6، تتوقف الدالة عن العد عند أول تطابق فارغ حتى إذا كان النمط يسمح بذلك.
  * في الإصدارات >= 25.6، تواصل الدالة التنفيذ عند حدوث تطابق فارغ. ويمكن استعادة السلوك القديم باستخدام الإعداد `count_matches_stop_at_empty_match = true`;
</Info>

**البنية**

```sql theme={null}
countMatches(haystack, pattern)
```

**الوسيطات**

* `haystack` — السلسلة النصية المطلوب البحث فيها. [`String`](/ar/reference/data-types/string)
* `pattern` — نمط التعبير النمطي. [`String`](/ar/reference/data-types/string)

**القيمة المعادة**

يعيد عدد المطابقات التي عُثر عليها. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**عدّ تسلسلات الأرقام**

```sql title=Query theme={null}
SELECT countMatches('hello 123 world 456 test', '[0-9]+')
```

```response title=Response theme={null}
┌─countMatches('hello 123 world 456 test', '[0-9]+')─┐
│                                                   2 │
└─────────────────────────────────────────────────────┘
```

<div id="countMatchesCaseInsensitive">
  ## countMatchesCaseInsensitive
</div>

استُحدث في: v21.1.0

مشابه لـ [`countMatches`](#countMatches)، لكنه يُجري مطابقة تتجاهل حالة الأحرف.

**البنية**

```sql theme={null}
countMatchesCaseInsensitive(haystack, pattern)
```

**الوسيطات**

* `haystack` — السلسلة النصية المراد البحث فيها. [`String`](/ar/reference/data-types/string)
* `pattern` — نمط تعبير نمطي. [`const String`](/ar/reference/data-types/string)

**القيمة المعادة**

يعيد عدد المطابقات التي تم العثور عليها. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**العدّ دون تمييز بين الأحرف الكبيرة والصغيرة**

```sql title=Query theme={null}
SELECT countMatchesCaseInsensitive('Hello HELLO world', 'hello')
```

```response title=Response theme={null}
┌─countMatchesCaseInsensitive('Hello HELLO world', 'hello')─┐
│                                                         2 │
└───────────────────────────────────────────────────────────┘
```

<div id="countSubstrings">
  ## countSubstrings
</div>

أُضيف في: v21.1.0

يُرجع عدد مرات ظهور السلسلة الفرعية `needle` ضمن السلسلة `haystack`.

**البنية**

```sql theme={null}
countSubstrings(haystack, needle[, start_pos])
```

**المعاملات**

* `haystack` — السلسلة التي يُجرى البحث فيها. [String](/ar/reference/data-types/string) أو [Enum](/ar/reference/data-types/enum). - `needle` — السلسلة الفرعية المطلوب البحث عنها. [String](/ar/reference/data-types/string). - `start_pos` — الموضع (بدءًا من 1) في `haystack` الذي يبدأ منه البحث. [UInt](/ar/reference/data-types/int-uint). اختياري.

**القيمة المُعادة**

عدد مرات الظهور. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT countSubstrings('aaaa', 'aa');
```

```response title=Response theme={null}
┌─countSubstrings('aaaa', 'aa')─┐
│                             2 │
└───────────────────────────────┘
```

**باستخدام الوسيط start\_pos**

```sql title=Query theme={null}
SELECT countSubstrings('abc___abc', 'abc', 4);
```

```response title=Response theme={null}
┌─countSubstrings('abc___abc', 'abc', 4)─┐
│                                      1 │
└────────────────────────────────────────┘
```

<div id="countSubstringsCaseInsensitive">
  ## countSubstringsCaseInsensitive
</div>

قُدِّمت في: v21.1.0

مثل [`countSubstrings`](#countSubstrings)، لكنه يحسب بغض النظر عن حالة الأحرف.

**الصياغة**

```sql theme={null}
countSubstringsCaseInsensitive(haystack, needle[, start_pos])
```

**الوسائط**

* `haystack` — السلسلة التي يُجرى فيها البحث. [`String`](/ar/reference/data-types/string) أو [`Enum`](/ar/reference/data-types/enum)
* `needle` — السلسلة الفرعية المطلوب البحث عنها. [`String`](/ar/reference/data-types/string)
* `start_pos` — اختياري. الموضع (بدءًا من 1) في `haystack` الذي يبدأ منه البحث. [`UInt*`](/ar/reference/data-types/int-uint)

**القيمة المُعادة**

يُرجع عدد مرات ظهور `needle` في `haystack`. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT countSubstringsCaseInsensitive('AAAA', 'aa');
```

```response title=Response theme={null}
┌─countSubstri⋯AAA', 'aa')─┐
│                        2 │
└──────────────────────────┘
```

**باستخدام الوسيطة start\_pos**

```sql title=Query theme={null}
SELECT countSubstringsCaseInsensitive('abc___ABC___abc', 'abc', 4);
```

```response title=Response theme={null}
┌─countSubstri⋯, 'abc', 4)─┐
│                        2 │
└──────────────────────────┘
```

<div id="countSubstringsCaseInsensitiveUTF8">
  ## countSubstringsCaseInsensitiveUTF8
</div>

أُضيفت في: v21.1.0

مشابهة لـ [`countSubstrings`](#countSubstrings)، لكنها تحسب بدون حساسية لحالة الأحرف، وتفترض أن haystack عبارة عن سلسلة UTF-8.

**الصيغة**

```sql theme={null}
countSubstringsCaseInsensitiveUTF8(haystack, needle[, start_pos])
```

**المعاملات**

* `haystack` — سلسلة UTF-8 يُجرى البحث فيها. [`String`](/ar/reference/data-types/string) أو [`Enum`](/ar/reference/data-types/enum)
* `needle` — سلسلة فرعية يُبحث عنها. [`String`](/ar/reference/data-types/string)
* `start_pos` — اختياري. الموضع (ابتداءً من 1) في `haystack` الذي يبدأ منه البحث. [`UInt*`](/ar/reference/data-types/int-uint)

**القيمة المُعادة**

يعيد عدد مرات ظهور `needle` في `haystack`. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT countSubstringsCaseInsensitiveUTF8('ложка, кошка, картошка', 'КА');
```

```response title=Response theme={null}
┌─countSubstri⋯шка', 'КА')─┐
│                        4 │
└──────────────────────────┘
```

**مع الوسيطة start\_pos**

```sql title=Query theme={null}
SELECT countSubstringsCaseInsensitiveUTF8('ложка, кошка, картошка', 'КА', 13);
```

```response title=Response theme={null}
┌─countSubstri⋯, 'КА', 13)─┐
│                        2 │
└──────────────────────────┘
```

<div id="extract">
  ## extract
</div>

متوفر منذ: v1.1.0

يستخرج أول تطابق لتعبير نمطي في سلسلة نصية.
إذا لم يطابق 'haystack' ‏'pattern'، فستُعاد سلسلة فارغة.

تستخدم هذه الدالة مكتبة RE2 للتعبيرات النمطية. يُرجى الرجوع إلى [re2](https://github.com/google/re2/wiki/Syntax) للاطلاع على البنية المدعومة.

إذا كان التعبير النمطي يحتوي على مجموعات ملتقطة (أنماطًا فرعية)، فستطابق الدالة سلسلة الإدخال مع أول مجموعة ملتقطة.

**البنية**

```sql theme={null}
extract(haystack, pattern)
```

**الوسيطات**

* `haystack` — السلسلة المراد الاستخراج منها. [`String`](/ar/reference/data-types/string)
* `pattern` — تعبير نمطي، يحتوي عادةً على مجموعة التقاط. [`const String`](/ar/reference/data-types/string)

**القيمة المعادة**

يعيد الجزء المستخرج على هيئة سلسلة. [`String`](/ar/reference/data-types/string)

**أمثلة**

**استخراج النطاق من البريد الإلكتروني**

```sql title=Query theme={null}
SELECT extract('test@clickhouse.com', '.*@(.*)$')
```

```response title=Response theme={null}
┌─extract('test@clickhouse.com', '.*@(.*)$')─┐
│ clickhouse.com                            │
└───────────────────────────────────────────┘
```

**إذا لم توجد مطابقة، تُعاد سلسلة فارغة**

```sql title=Query theme={null}
SELECT extract('test@clickhouse.com', 'no_match')
```

```response title=Response theme={null}
┌─extract('test@clickhouse.com', 'no_match')─┐
│                                            │
└────────────────────────────────────────────┘
```

<div id="extractAll">
  ## extractAll
</div>

أُضيفت في: v1.1.0

مثل [`extract`](#extract)، لكنها تُرجِع مصفوفة تضم جميع مطابقات التعبير النمطي في سلسلة نصية.
إذا لم يطابق 'haystack' التعبير النمطي 'pattern'، فستُرجَع مصفوفة فارغة.

إذا كان التعبير النمطي يحتوي على مجموعات ملتقطة (أنماط فرعية)، فستُطابِق الدالة سلسلة الإدخال مع أول مجموعة ملتقطة.

**البنية**

```sql theme={null}
extractAll(haystack, pattern)
```

**الوسيطات**

* `haystack` — السلسلة التي تُستخرج منها المقاطع. [`String`](/ar/reference/data-types/string)
* `pattern` — تعبير نمطي، وقد يتضمن اختياريًا مجموعات التقاط. [`const String`](/ar/reference/data-types/string)

**القيمة المعادة**

يعيد مصفوفة من المقاطع المستخرجة. [`Array(String)`](/ar/reference/data-types/array)

**أمثلة**

**استخراج جميع الأرقام**

```sql title=Query theme={null}
SELECT extractAll('hello 123 world 456', '[0-9]+')
```

```response title=Response theme={null}
┌─extractAll('hello 123 world 456', '[0-9]+')─┐
│ ['123','456']                               │
└─────────────────────────────────────────────┘
```

**الاستخراج باستخدام مجموعة الالتقاط**

```sql title=Query theme={null}
SELECT extractAll('test@example.com, user@domain.org', '([a-zA-Z0-9]+)@')
```

```response title=Response theme={null}
┌─extractAll('test@example.com, user@domain.org', '([a-zA-Z0-9]+)@')─┐
│ ['test','user']                                                    │
└────────────────────────────────────────────────────────────────────┘
```

<div id="extractAllGroupsHorizontal">
  ## extractAllGroupsHorizontal
</div>

أُضيفت في: v20.5.0

تطابق جميع مجموعات السلسلة النصية باستخدام التعبير النمطي الموفَّر، وتُرجع مصفوفة من المصفوفات، بحيث تحتوي كل مصفوفة على جميع القيم الملتقطة من المجموعة الملتقِطة نفسها، مرتبة حسب رقم المجموعة.

**البنية**

```sql theme={null}
extractAllGroupsHorizontal(s, regexp)
```

**الوسيطات**

* `s` — `سلسلة الإدخال` المطلوب الاستخراج منها. [`String`](/ar/reference/data-types/string) أو [`FixedString`](/ar/reference/data-types/fixedstring)
* `regexp` — `تعبير نمطي` لإجراء المطابقة. [`const String`](/ar/reference/data-types/string) أو [`const FixedString`](/ar/reference/data-types/fixedstring)

**القيمة المعادة**

تعيد `مصفوفة من المصفوفات`، حيث تحتوي كل مصفوفة داخلية على جميع القيم الملتقطة من مجموعة ملتقطة واحدة عبر كل المطابقات. تحتوي المصفوفة الداخلية الأولى على جميع القيم الملتقطة من المجموعة 1، والثانية من المجموعة 2، وهكذا. وإذا لم يتم العثور على أي مطابقات، فستُعاد مصفوفة فارغة. [`Array(Array(String))`](/ar/reference/data-types/array)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
WITH '< Server: nginx
< Date: Tue, 22 Jan 2019 00:26:14 GMT
< Content-Type: text/html; charset=UTF-8
< Connection: keep-alive
' AS s
SELECT extractAllGroupsHorizontal(s, '< ([\\w\\-]+): ([^\\r\\n]+)');
```

```response title=Response theme={null}
[['Server','Date','Content-Type','Connection'],['nginx','Tue, 22 Jan 2019 00:26:14 GMT','text/html; charset=UTF-8','keep-alive']]
```

<div id="extractGroups">
  ## extractGroups
</div>

أُضيفت في: v20.5.0

يستخرج مجموعات الالتقاط من أول سلسلة فرعية يطابقها تعبير نمطي. ولاستخراج المجموعات من جميع المطابقات، استخدم [`extractAllGroupsHorizontal`](#extractAllGroupsHorizontal) أو [`extractAllGroupsVertical`](/ar/reference/functions/regular-functions/splitting-merging-functions#extractAllGroupsVertical).

**الصيغة**

```sql theme={null}
extractGroups(s, regexp)
```

**المعاملات**

* `s` — سلسلة الإدخال المطلوب الاستخراج منها. [`String`](/ar/reference/data-types/string) أو [`FixedString`](/ar/reference/data-types/fixedstring)
* `regexp` — تعبير نمطي. يجب أن يحتوي على مجموعة ملتقطة واحدة على الأقل. ثابت. [`const String`](/ar/reference/data-types/string) أو [`const FixedString`](/ar/reference/data-types/fixedstring)

**القيمة المُعادة**

إذا وُجد تطابق مع التعبير النمطي، فستُعاد مصفوفة تحتوي على المجموعات الملتقطة (`1` إلى `N`، حيث إن `N` هو عدد المجموعات الملتقطة في `regexp`) لأول تطابق. وإذا لم يوجد تطابق، فستُعاد مصفوفة فارغة. [`Array(String)`](/ar/reference/data-types/array)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
WITH '< Server: nginx
< Date: Tue, 22 Jan 2019 00:26:14 GMT
< Content-Type: text/html; charset=UTF-8
< Connection: keep-alive
' AS s
SELECT extractGroups(s, '< ([\\w\\-]+): ([^\\r\\n]+)');
```

```response title=Response theme={null}
['Server','nginx']
```

<div id="hasAllTokens">
  ## hasAllTokens
</div>

أُضيف في: v25.10.0

مثل [`hasAnyTokens`](#hasAnyTokens)، لكنه يعيد 1 إذا كانت جميع الرموز في السلسلة أو المصفوفة `needle` تطابق السلسلة `input`، ويعيد 0 خلاف ذلك. وإذا كانت `input` عمودًا، فإنه يعيد جميع الصفوف التي تستوفي هذا الشرط.

<Note>
  يجب أن يكون للعمود `input` [فهرس نصي](/ar/reference/engines/table-engines/mergetree-family/textindexes) معرّف لضمان أفضل أداء.
  إذا لم يكن هناك فهرس نصي معرّف، فستُجري الدالة مسحًا كاملًا للعمود دون استخدام فهرس، وهو أبطأ بكثير من البحث باستخدام فهرس.
</Note>

قبل البحث، تُجزِّئ الدالة إلى رموز:

* الوسيط `input` (دائمًا)، و
* الوسيط `needle` (إذا أُعطي على هيئة [String](/ar/reference/data-types/string))
  باستخدام مُجزِّئ الرموز المحدد للفهرس النصي.
  إذا لم يكن للعمود فهرس نصي معرّف، فسيُستخدم بدلًا منه مُجزِّئ الرموز `splitByNonAlpha`.
  إذا كان الوسيط `needle` من النوع [Array(String)](/ar/reference/data-types/array)، فسيُعامل كل عنصر في المصفوفة على أنه رمز — ولا تُجرى أي عملية إضافية لتجزئته إلى رموز.

تُتجاهل الرموز المكررة.
على سبيل المثال، تُعامل needles = \['ClickHouse', 'ClickHouse'] بالطريقة نفسها مثل \['ClickHouse'].

<Note>
  عندما يعرّف الفهرس النصي [معالجًا مسبقًا](/ar/reference/engines/table-engines/mergetree-family/textindexes#creating-a-text-index) (على سبيل المثال `lowerUTF8`)، فإن `hasAllTokens` يطبّقه على `input`، وعندما تكون `needles` من نوع [String](/ar/reference/data-types/string)، يطبّقه أيضًا على `needles` قبل تجزئتها إلى رموز. وعندما تكون `needles` من نوع [Array(String)](/ar/reference/data-types/array)، فتمرَّر عناصرها كما هي ولا يُطبَّق عليها المعالج المسبق.
  لا يُطبَّق المعالج المسبق إلا على مسار الفهرس النصي، لذلك قد تختلف النتائج بين الاستعلامات التي تستخدم الفهرس النصي والاستعلامات التي لا تستخدمه (مثل `SETTINGS use_skip_indexes = 0`).
  يُتسامح مع هذا التباين لتحسين سهولة استخدام البحث بالنص الكامل.
</Note>

**البنية**

```sql theme={null}
hasAllTokens(input, needles)
```

**الأسماء البديلة**: `hasAllToken`

**الوسيطات**

* `input` — عمود الإدخال. [`String`](/ar/reference/data-types/string) أو [`FixedString`](/ar/reference/data-types/fixedstring) أو [`Array(String)`](/ar/reference/data-types/array) أو [`Array(FixedString)`](/ar/reference/data-types/array)
* `needles` — الرموز المراد البحث عنها. [`String`](/ar/reference/data-types/string) أو [`Array(String)`](/ar/reference/data-types/array)
* `tokenizer` — مُجزِّئ الرموز المميزّة المراد استخدامه. الوسيطات الصالحة هي `splitByNonAlpha` و`splitByString` و`asciiCJK` و`ngrams` و`sparseGrams` و`array`. وهو اختياري، وإذا لم يُحدَّد صراحةً، فستكون القيمة الافتراضية `splitByNonAlpha`. [`const String`](/ar/reference/data-types/string)

**القيمة المُعادة**

تُعيد 1 إذا تطابقت جميع الرموز المراد البحث عنها، وإلا فتُعيد 0. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**استخدام أساسي مع سلسلة بحث من نوع String**

```sql title=Query theme={null}
CREATE TABLE table (
    id UInt32,
    msg String,
    INDEX idx(msg) TYPE text(tokenizer = splitByString(['()', '\\']))
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO table VALUES (1, '()a,\\bc()d'), (2, '()\\a()bc\\d'), (3, ',()a\\,bc,(),d,');

SELECT count() FROM table WHERE hasAllTokens(msg, 'a\\d()');
```

```response title=Response theme={null}
┌─count()─┐
│       1 │
└─────────┘
```

**حدِّد أنماط البحث المطلوب العثور عليها كما هي (من دون تجزئة إلى وحدات) في مصفوفة**

```sql title=Query theme={null}
SELECT count() FROM table WHERE hasAllTokens(msg, ['a', 'd']);
```

```response title=Response theme={null}
┌─count()─┐
│       1 │
└─────────┘
```

**أنشئ سلاسل البحث باستخدام الدالة `tokens`**

```sql title=Query theme={null}
SELECT count() FROM table WHERE hasAllTokens(msg, tokens('a()d', 'splitByString', ['()', '\\']));
```

```response title=Response theme={null}
┌─count()─┐
│       1 │
└─────────┘
```

**استخدم مُجزِّئًا مخصصًا عبر المُعامِل الثالث**

```sql title=Query theme={null}
SELECT hasAllTokens('abcdef', 'abc', 'ngrams(3)');
```

```response title=Response theme={null}
┌─hasAllTokens('abcdef', 'abc', 'ngrams(3)')─┐
│                                            1 │
└──────────────────────────────────────────────┘
```

**أمثلة على استخدام أعمدة Array وMap**

```sql title=Query theme={null}
CREATE TABLE log (
    id UInt32,
    tags Array(String),
    attributes Map(String, String),
    INDEX idx_tags (tags) TYPE text(tokenizer = splitByNonAlpha),
    INDEX idx_attributes_keys mapKeys(attributes) TYPE text(tokenizer = array),
    INDEX idx_attributes_vals mapValues(attributes) TYPE text(tokenizer = array)
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO log VALUES
    (1, ['clickhouse', 'clickhouse cloud'], {'address': '192.0.0.1', 'log_level': 'INFO'}),
    (2, ['chdb'], {'embedded': 'true', 'log_level': 'DEBUG'});
```

```response title=Response theme={null}
```

**مثال على عمود من نوع المصفوفة**

```sql title=Query theme={null}
SELECT count() FROM log WHERE hasAllTokens(tags, 'clickhouse');
```

```response title=Response theme={null}
┌─count()─┐
│       1 │
└─────────┘
```

**مثال على mapKeys**

```sql title=Query theme={null}
SELECT count() FROM log WHERE hasAllTokens(mapKeys(attributes), ['address', 'log_level']);
```

```response title=Response theme={null}
┌─count()─┐
│       1 │
└─────────┘
```

**مثال على mapValues**

```sql title=Query theme={null}
SELECT count() FROM log WHERE hasAllTokens(mapValues(attributes), ['192.0.0.1', 'DEBUG']);
```

```response title=Response theme={null}
┌─count()─┐
│       0 │
└─────────┘
```

<div id="hasAnyTokens">
  ## hasAnyTokens
</div>

أُضيف في: v25.10.0

يعيد 1 إذا طابق رمز واحد على الأقل في السلسلة أو المصفوفة `needle` السلسلة `input`، ويعيد 0 خلاف ذلك. وإذا كانت `input` عمودًا، فإنه يعيد جميع الصفوف التي تستوفي هذا الشرط.

<Note>
  يجب تعريف [فهرس نصي](/ar/reference/engines/table-engines/mergetree-family/textindexes) على العمود `input` لتحقيق أفضل أداء.
  وإذا لم يكن هناك فهرس نصي معرّف، فستُجري الدالة فحصًا كاملًا للعمود بالقوة الغاشمة، وهو أبطأ بعدة مراتب من البحث باستخدام فهرس.
</Note>

قبل البحث، تُجزِّئ الدالة إلى رموز:

* الوسيط `input` (دائمًا)، و
* الوسيط `needle` (إذا أُعطي على هيئة [String](/ar/reference/data-types/string))
  باستخدام مُقسِّم الرموز المحدد للفهرس النصي.
  وإذا لم يكن للعمود فهرس نصي معرّف، فسيُستخدم بدلًا من ذلك مُقسِّم الرموز `splitByNonAlpha`.
  وإذا كان الوسيط `needle` من النوع [Array(String)](/ar/reference/data-types/array)، فسيُعامل كل عنصر في المصفوفة على أنه رمز — ولا يحدث أي تجزئة إضافية إلى رموز.

تُتجاهل الرموز المكررة.
فعلى سبيل المثال، \['ClickHouse', 'ClickHouse'] تُعامل بالطريقة نفسها مثل \['ClickHouse'].

<Note>
  عندما يعرّف الفهرس النصي [معالجًا مسبقًا](/ar/reference/engines/table-engines/mergetree-family/textindexes#creating-a-text-index) (على سبيل المثال `lowerUTF8`)، فإن `hasAnyTokens` تطبّقه على `input`، وعندما تكون `needles` من النوع [String](/ar/reference/data-types/string)، على `needles` قبل التجزئة إلى رموز. وعندما تكون `needles` من النوع [Array(String)](/ar/reference/data-types/array)، تمر عناصرها كما هي ولا يُطبَّق عليها المعالج المسبق.
  لا يُطبَّق المعالج المسبق إلا في مسار الفهرس النصي، لذا قد تختلف النتائج بين الاستعلامات التي تستخدم الفهرس النصي والاستعلامات التي لا تستخدمه (مثل `SETTINGS use_skip_indexes = 0`).
  ويُتسامح مع هذا التباين لتحسين سهولة استخدام البحث النصي الكامل.
</Note>

**الصياغة**

```sql theme={null}
hasAnyTokens(input, needles)
```

**الأسماء المستعارة**: `hasAnyToken`

**الوسيطات**

* `input` — عمود الإدخال. [`String`](/ar/reference/data-types/string) أو [`FixedString`](/ar/reference/data-types/fixedstring) أو [`Nullable(String)`](/ar/reference/data-types/nullable) أو [`Nullable(FixedString)`](/ar/reference/data-types/nullable) أو [`Array(String)`](/ar/reference/data-types/array) أو [`Array(FixedString)`](/ar/reference/data-types/array) أو [`Array(Nullable(String))`](/ar/reference/data-types/array) أو [`Array(Nullable(FixedString))`](/ar/reference/data-types/array)
* `needles` — التوكنات المراد البحث عنها. [`String`](/ar/reference/data-types/string) أو [`Array(String)`](/ar/reference/data-types/array)
* `tokenizer` — أداة تقسيم النص المستخدمة. الوسيطات الصالحة هي `splitByNonAlpha` و`splitByString` و`asciiCJK` و`ngrams` و`sparseGrams` و`array`. هذا الوسيط اختياري، وإذا لم يُحدَّد صراحةً، تكون القيمة الافتراضية `splitByNonAlpha`. [`const String`](/ar/reference/data-types/string)

**القيمة المعادة**

تُرجِع `1` إذا وُجدت مطابقة واحدة على الأقل، وإلا فتُرجِع `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**الاستخدام الأساسي مع نمط بحث نصي**

```sql title=Query theme={null}
CREATE TABLE table (
    id UInt32,
    msg String,
    INDEX idx(msg) TYPE text(tokenizer = splitByString(['()', '\\']))
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO table VALUES (1, '()a,\\bc()d'), (2, '()\\a()bc\\d'), (3, ',()a\\,bc,(),d,');

SELECT count() FROM table WHERE hasAnyTokens(msg, 'a\\d()');
```

```response title=Response theme={null}
┌─count()─┐
│       3 │
└─────────┘
```

**حدِّد سلاسل البحث المطلوب البحث عنها كما هي (من دون تجزئة إلى رموز) داخل مصفوفة**

```sql title=Query theme={null}
SELECT count() FROM table WHERE hasAnyTokens(msg, ['a', 'd']);
```

```response title=Response theme={null}
┌─count()─┐
│       3 │
└─────────┘
```

**ولِّد أنماط البحث باستخدام الدالة `tokens`**

```sql title=Query theme={null}
SELECT count() FROM table WHERE hasAnyTokens(msg, tokens('a()d', 'splitByString', ['()', '\\']));
```

```response title=Response theme={null}
┌─count()─┐
│       3 │
└─────────┘
```

**أمثلة على استخدام الأعمدة من النوع Array وMap**

```sql title=Query theme={null}
CREATE TABLE log (
    id UInt32,
    tags Array(String),
    attributes Map(String, String),
    INDEX idx_tags (tags) TYPE text(tokenizer = splitByNonAlpha),
    INDEX idx_attributes_keys mapKeys(attributes) TYPE text(tokenizer = array),
    INDEX idx_attributes_vals mapValues(attributes) TYPE text(tokenizer = array)
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO log VALUES
    (1, ['clickhouse', 'clickhouse cloud'], {'address': '192.0.0.1', 'log_level': 'INFO'}),
    (2, ['chdb'], {'embedded': 'true', 'log_level': 'DEBUG'});
```

```response title=Response theme={null}
```

**مثال على عمود من نوع Array**

```sql title=Query theme={null}
SELECT count() FROM log WHERE hasAnyTokens(tags, 'clickhouse');
```

```response title=Response theme={null}
┌─count()─┐
│       1 │
└─────────┘
```

**مثال على استخدام mapKeys**

```sql title=Query theme={null}
SELECT count() FROM log WHERE hasAnyTokens(mapKeys(attributes), ['address', 'log_level']);
```

```response title=Response theme={null}
┌─count()─┐
│       2 │
└─────────┘
```

**مثال باستخدام mapValues**

```sql title=Query theme={null}
SELECT count() FROM log WHERE hasAnyTokens(mapValues(attributes), ['192.0.0.1', 'DEBUG']);
```

```response title=Response theme={null}
┌─count()─┐
│       2 │
└─────────┘
```

<div id="hasPhrase">
  ## hasPhrase
</div>

أُضيف في: v26.4.0

يتحقق مما إذا كان `input` يحتوي على جميع الرموز من `phrase` بترتيب متتابع.

<Note>
  يجب أن يكون للعمود `input` [فهرس نصي](/ar/reference/engines/table-engines/mergetree-family/textindexes) مُعرّف للحصول على أفضل أداء.
  إذا لم يكن هناك فهرس نصي مُعرّف، فستُجري الدالة فحصًا كاملًا للعمود، وهو أبطأ بعدة مراتب من البحث عبر الفهرس.
</Note>

قبل البحث، تُجزِّئ الدالة كلًّا من الوسيطين `input` و`phrase` إلى رموز باستخدام مُجزِّئ الرموز المحدد للفهرس النصي.
إذا لم يكن للعمود فهرس نصي مُعرّف، فسيُستخدم بدلًا من ذلك مُجزِّئ الرموز `splitByNonAlpha` — ما لم يتم تمرير مُجزِّئ رموز باعتباره الوسيط الثالث الاختياري.
يجب أن يكون وسيط مُجزِّئ الرموز واحدًا من `splitByNonAlpha` أو `splitByString` أو `ngrams` أو `asciiCJK`.

<Note>
  عندما يعرّف الفهرس النصي [معالجًا مسبقًا](/ar/reference/engines/table-engines/mergetree-family/textindexes#creating-a-text-index) (على سبيل المثال `lowerUTF8`)، تطبّقه `hasPhrase` على كلٍّ من `input` و`phrase` قبل تجزئتهما إلى رموز.
  لا يُطبَّق المعالج المسبق إلا في مسار الفهرس النصي، لذلك قد تختلف النتائج بين الاستعلامات التي تستخدم الفهرس النصي والاستعلامات التي لا تستخدمه (مثل `SETTINGS use_skip_indexes = 0`).
  يُتسامح مع هذا التباين لتحسين سهولة استخدام البحث النصي الكامل.
</Note>

بخلاف [`hasToken`](#hasToken) و[`hasAnyTokens`](#hasAnyTokens) و[`hasAllTokens`](#hasAllTokens)، تتطلب `hasPhrase` أن تظهر الرموز بالترتيب نفسه
ومن دون أي رموز فاصلة بينها. على سبيل المثال، تُرجع `hasPhrase('the quick brown fox', 'quick fox')` القيمة 0
لأن "brown" تظهر بين "quick" و"fox".

**الصياغة**

```sql theme={null}
hasPhrase(input, phrase[, tokenizer])
```

**الأسماء المستعارة**: `matchPhrase`

**المعاملات**

* `input` — عمود الإدخال. [`String`](/ar/reference/data-types/string) أو [`FixedString`](/ar/reference/data-types/fixedstring)
* `phrase` — العبارة المراد البحث عنها. [`const String`](/ar/reference/data-types/string)
* `tokenizer` — أداة تقسيم النص إلى رموز المراد استخدامها. اختياري، والقيمة الافتراضية هي `splitByNonAlpha`. [`const String`](/ar/reference/data-types/string)

**القيمة المعادة**

تُرجع `1` إذا عُثر على العبارة كتسلسل متتالٍ من الرموز، وإلا فتُرجع `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مطابقة العبارة**

```sql title=Query theme={null}
SELECT hasPhrase('the quick brown fox jumps', 'quick brown')
```

```response title=Response theme={null}
┌─hasPhrase('the quick brown fox jumps', 'quick brown')─┐
│                                                      1 │
└────────────────────────────────────────────────────────┘
```

**رموز غير متتالية**

```sql title=Query theme={null}
SELECT hasPhrase('the quick brown fox jumps', 'quick fox')
```

```response title=Response theme={null}
┌─hasPhrase('the quick brown fox jumps', 'quick fox')─┐
│                                                    0 │
└──────────────────────────────────────────────────────┘
```

<div id="hasSubsequence">
  ## hasSubsequence
</div>

أُضيف في الإصدار: v23.7.0

يتحقق مما إذا كان needle تسلسلاً فرعيًا من haystack.
التسلسل الفرعي لسلسلة نصية هو تسلسل يمكن اشتقاقه من سلسلة أخرى بحذف بعض المحارف أو دون حذف أي محرف، من دون تغيير ترتيب المحارف المتبقية.

**الصياغة**

```sql theme={null}
hasSubsequence(haystack, needle)
```

**الوسائط**

* `haystack` — السلسلة التي يُبحث فيها عن التسلسل الفرعي. [`String`](/ar/reference/data-types/string)
* `needle` — التسلسل الفرعي المطلوب البحث عنه. [`String`](/ar/reference/data-types/string)

**القيمة المعادة**

يعيد `1` إذا كان needle تسلسلاً فرعياً من haystack، وإلا فيعيد `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**فحص أساسي لتسلسل فرعي**

```sql title=Query theme={null}
SELECT hasSubsequence('Hello World', 'HlWrd')
```

```response title=Response theme={null}
┌─hasSubsequence('Hello World', 'HlWrd')─┐
│                                      1 │
└────────────────────────────────────────┘
```

**تعذّر العثور على تسلسل فرعي**

```sql title=Query theme={null}
SELECT hasSubsequence('Hello World', 'xyz')
```

```response title=Response theme={null}
┌─hasSubsequence('Hello World', 'xyz')─┐
│                                    0 │
└──────────────────────────────────────┘
```

<div id="hasSubsequenceCaseInsensitive">
  ## hasSubsequenceCaseInsensitive
</div>

استُحدثت في: v23.7.0

مثل [`hasSubsequence`](#hasSubsequence)، لكنه يبحث مع تجاهل حالة الأحرف.

**الصياغة**

```sql theme={null}
hasSubsequenceCaseInsensitive(haystack, needle)
```

**الوسيطات**

* `haystack` — السلسلة النصية التي يُجرى البحث ضمنها. [`String`](/ar/reference/data-types/string)
* `needle` — المتتالية الجزئية المراد البحث عنها. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

تُرجع 1 إذا كانت `needle` متتالية جزئية من `haystack`، وإلا فتُرجع 0. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT hasSubsequenceCaseInsensitive('garbage', 'ARG');
```

```response title=Response theme={null}
┌─hasSubsequenceCaseInsensitive('garbage', 'ARG')─┐
│                                               1 │
└─────────────────────────────────────────────────┘
```

<div id="hasSubsequenceCaseInsensitiveUTF8">
  ## hasSubsequenceCaseInsensitiveUTF8
</div>

أُضيف في: v23.7.0

مثل [`hasSubsequenceUTF8`](#hasSubsequenceUTF8)، لكنه يبحث دون التفريق بين الأحرف الكبيرة والصغيرة.

**الصياغة**

```sql theme={null}
hasSubsequenceCaseInsensitiveUTF8(haystack, needle)
```

**الوسيطات**

* `haystack` — سلسلة مرمّزة بـ UTF8 يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `needle` — سلسلة تسلسل فرعي مرمّزة بـ UTF8 يُبحث عنها. [`String`](/ar/reference/data-types/string)

**القيمة المعادة**

تُرجِع 1 إذا كانت `needle` تسلسلاً فرعيًا من `haystack`، وإلا فتُرجِع 0. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT hasSubsequenceCaseInsensitiveUTF8('ClickHouse - столбцовая система управления базами данных', 'СИСТЕМА');
```

```response title=Response theme={null}
┌─hasSubsequen⋯ 'СИСТЕМА')─┐
│                        1 │
└──────────────────────────┘
```

<div id="hasSubsequenceUTF8">
  ## hasSubsequenceUTF8
</div>

قُدِّمت في: v23.7.0

تشبه [`hasSubsequence`](/ar/reference/functions/regular-functions/string-search-functions#hasSubsequence)، لكنها تفترض أن haystack و needle سلسلتان نصيتان مرمَّزتان بترميز UTF-8.

**البنية**

```sql theme={null}
hasSubsequenceUTF8(haystack, needle)
```

**الوسائط**

* `haystack` — السلسلة التي يُبحث فيها. [`String`](/ar/reference/data-types/string)
* `needle` — التسلسل الفرعي المراد البحث عنه. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

تُرجع `1` إذا كان `needle` تسلسلاً فرعيًا من `haystack`، وإلا فتُرجع `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT hasSubsequenceUTF8('картошка', 'кошка');
```

```response title=Response theme={null}
┌─hasSubsequen⋯', 'кошка')─┐
│                        1 │
└──────────────────────────┘
```

**تسلسل فرعي غير متطابق**

```sql title=Query theme={null}
SELECT hasSubsequenceUTF8('картошка', 'апельсин');
```

```response title=Response theme={null}
┌─hasSubsequen⋯'апельсин')─┐
│                        0 │
└──────────────────────────┘
```

<div id="hasToken">
  ## hasToken
</div>

أُضيف في: v20.1.0

يتحقق مما إذا كان `token` المُعطى موجودًا في النص المراد البحث فيه.

يستخدم [splitByNonAlpha](/ar/reference/functions/regular-functions/splitting-merging-functions#splitByNonAlpha) كمُجزِّئ للرموز، أي إن `token` يُعرَّف بأنه أطول تتابع فرعي ممكن من المحارف المتتالية `[0-9A-Za-z_]` (الأرقام، ومحارف ASCII، والشرطة السفلية).

**البنية**

```sql theme={null}
hasToken(haystack, token)
```

**الوسيطات**

* `haystack` — السلسلة النصية المطلوب البحث فيها. [`String`](/ar/reference/data-types/string)
* `token` — التوكن المطلوب البحث عنه. [`const String`](/ar/reference/data-types/string)

**القيمة المُعادة**

تُرجع `1` إذا عُثر على التوكن، و`0` خلاف ذلك. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**البحث عن توكن**

```sql title=Query theme={null}
SELECT hasToken('clickhouse test', 'test')
```

```response title=Response theme={null}
┌─hasToken('clickhouse test', 'test')─┐
│                                   1 │
└─────────────────────────────────────┘
```

<div id="hasTokenCaseInsensitive">
  ## hasTokenCaseInsensitive
</div>

قُدِّمت في: v20.1.0

ينفّذ بحثًا غير حساس لحالة الأحرف عن `needle` داخل `haystack` باستخدام الفهرس tokenbf\_v1.

**الصياغة**

```sql theme={null}
hasTokenCaseInsensitive(haystack, needle)
```

**المعاملات**

* لا شيء.

**القيمة المُعادة**

**أمثلة**

<div id="hasTokenCaseInsensitiveOrNull">
  ## hasTokenCaseInsensitiveOrNull
</div>

أُضيفت في: v23.1.0

تُجري بحثًا عن needle داخل haystack دون حساسية لحالة الأحرف باستخدام فهرس tokenbf\_v1. وتُرجع NULL إذا كان needle غير صالح التكوين.

**الصيغة**

```sql theme={null}
hasTokenCaseInsensitiveOrNull(haystack, needle)
```

**المعاملات**

* لا شيء.

**القيمة المُعادة**

**أمثلة**

<div id="hasTokenOrNull">
  ## hasTokenOrNull
</div>

قُدِّم في: v20.1.0

مثل [`hasToken`](#hasToken)، لكنه يُرجع NULL إذا كان الرمز غير مُشكَّل على نحو صحيح.

**الصيغة**

```sql theme={null}
hasTokenOrNull(haystack, token)
```

**الوسيطات**

* `haystack` — السلسلة المراد البحث فيها. يجب أن تكون ثابتة. [`String`](/ar/reference/data-types/string)
* `token` — الرمز المراد البحث عنه. [`const String`](/ar/reference/data-types/string)

**القيمة المُعادة**

يُرجع `1` إذا عُثر على الرمز، و`0` خلاف ذلك، و`NULL` إذا كان الرمز غير صحيح التكوين. [`Nullable(UInt8)`](/ar/reference/data-types/nullable)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT hasTokenOrNull('apple banana cherry', 'ban ana');
```

```response title=Response theme={null}
┌─hasTokenOrNu⋯ 'ban ana')─┐
│                     ᴺᵁᴸᴸ │
└──────────────────────────┘
```

<div id="highlight">
  ## highlight
</div>

أُضيفت في: v26.4.0

تُبرز مواضع ظهور مصطلحات البحث في سلسلة نصية عبر إحاطتها بوسوم HTML.

تُجري الدالة مطابقة ASCII غير حساسة لحالة الأحرف. وإذا تداخلت عدة مصطلحات بحث أو كانت متجاورة في النص، فتُدمج الأجزاء المطابَقة في مقطع مميّز واحد.

**الصياغة**

```sql theme={null}
highlight(haystack, needles[, open_tag, close_tag])
```

**الوسيطات**

* `haystack` — النص المراد البحث فيه. [`String`](/ar/reference/data-types/string) أو [`FixedString`](/ar/reference/data-types/fixedstring)
* `needles` — مصفوفة من عبارات البحث المراد إبرازها. [`const Array(String)`](/ar/reference/data-types/array)
* `open_tag` — وسم الفتح الذي يُدرج قبل كل تطابق. القيمة الافتراضية: `<em>`. [`const String`](/ar/reference/data-types/string)
* `close_tag` — وسم الإغلاق الذي يُدرج بعد كل تطابق. القيمة الافتراضية: `</em>`. [`const String`](/ar/reference/data-types/string)

**القيمة المُعادة**

يُرجع النص المُدخل مع إحاطة العبارات المتطابقة بالوسوم المحددة. [`String`](/ar/reference/data-types/string)

**أمثلة**

**إبراز أساسي**

```sql title=Query theme={null}
SELECT highlight('The quick brown fox', ['quick', 'fox'])
```

```response title=Response theme={null}
┌─highlight('The quick brown fox', ['quick', 'fox'])─┐
│ The <em>quick</em> brown <em>fox</em>              │
└────────────────────────────────────────────────────┘
```

**الوسوم المخصّصة**

```sql title=Query theme={null}
SELECT highlight('Hello World', ['hello'], '<b>', '</b>')
```

```response title=Response theme={null}
┌─highlight('Hello World', ['hello'], '<b>', '</b>')─┐
│ <b>Hello</b> World                                 │
└────────────────────────────────────────────────────┘
```

<div id="ilike">
  ## ilike
</div>

قُدِّم في: v20.6.0

مثل [`like`](#like)، لكنه يبحث بدون مراعاة حالة الأحرف. ويدعم عبارة `ESCAPE` الاختيارية (راجع `like`).

**البنية**

```sql theme={null}
ilike(haystack, pattern[, escape_character])
-- haystack ILIKE pattern [ESCAPE 'escape_character']
```

**الوسيطات**

* `haystack` — السلسلة النصية التي يُجرى فيها البحث. [`String`](/ar/reference/data-types/string) أو [`FixedString`](/ar/reference/data-types/fixedstring)
* `pattern` — نمط LIKE المطلوب مطابقته. [`String`](/ar/reference/data-types/string)
* `escape_character` — سلسلة اختيارية مكوّنة من محرف واحد تُستخدم كمحرف هروب بدلًا من `\`. الافتراضي: `\`. [`String`](/ar/reference/data-types/string)

**القيمة المعادة**

تُعيد `1` إذا كانت السلسلة تطابق نمط LIKE (غير حساس لحالة الأحرف)، وإلا تُعيد `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT ilike('ClickHouse', '%house%');
```

```response title=Response theme={null}
┌─ilike('ClickHouse', '%house%')─┐
│                              1 │
└────────────────────────────────┘
```

<div id="like">
  ## like
</div>

أُضيف في: v1.1.0

تُرجع ما إذا كانت السلسلة `haystack` تطابق تعبير `LIKE` ‏`pattern`.

يمكن أن يحتوي تعبير `LIKE` على أحرف عادية والرموز الوصفية التالية:

* يشير `%` إلى أي عدد من الأحرف كيفما كانت (بما في ذلك عدم وجود أي أحرف).
* يشير `_` إلى حرف واحد كيفما كان.
* تُستخدم `\` للهروب من الرموز الحرفية `%` و`_` و`\`.

تعتمد المطابقة على UTF-8، فمثلًا يطابق `_` نقطة الترميز Unicode ‏`¥`، التي تُمثَّل في UTF-8 باستخدام بايتين.

إذا لم تكن `haystack` أو تعبير `LIKE` صالحَين وفق UTF-8، فسيكون السلوك غير معرّف.

لا يُجرى أي تطبيع Unicode تلقائيًا، ويمكنك استخدام الدوال `normalizeUTF8*` لهذا الغرض.

للمطابقة مع `%` و`_` و`\` الحرفية (وهي محارف وصفية في `LIKE`)، أضف قبلها شرطة مائلة عكسية: `\%` و`\_` و`\\`.
وتفقد الشرطة المائلة العكسية معناها الخاص (أي تُفسَّر حرفيًا) إذا سبقت حرفًا غير `%` أو `_` أو `\`.

<Note>
  يتطلب ClickHouse أيضًا تهريب الشرطات المائلة العكسية داخل السلاسل [كما هو موضح هنا](/ar/reference/syntax#string)، لذا ستحتاج فعليًا إلى كتابة `\\%` و`\\_` و`\\\\`.
</Note>

بالنسبة إلى تعابير `LIKE` من الشكل `%needle%`، تكون الدالة بالسرعة نفسها التي تتمتع بها الدالة `position`.
أما جميع تعابير `LIKE` الأخرى فتُحوَّل داخليًا إلى تعبير نمطي وتُنفَّذ بأداء مماثل للدالة `match`.

<div id="escape-clause">
  ## عبارة ESCAPE
</div>

تحدّد عبارة `ESCAPE` الاختيارية محرف هروب مخصّصًا (ويجب أن يكون محرف ASCII واحدًا).
عند تحديده، يستبدل محرف الهروب المخصّص الشرطة المائلة العكسية الافتراضية عند التعامل مع المحرفين الخاصين `%` و `_`.
يمكن لمحرف الهروب أن يُستخدم مع ثلاثة أشياء: `%` (علامة نسبة مئوية حرفية)، و`_` (شرطة سفلية حرفية)، ونفسه (محرف هروب حرفي).
عند استخدام محرف هروب مخصّص، لا يعود للشرطة المائلة العكسية أي معنى خاص، وتُعامَل على أنها محرف حرفي.

**البنية**

```sql theme={null}
like(haystack, pattern[, escape_character])
-- haystack LIKE pattern [ESCAPE 'escape_character']
```

**الوسيطات**

* `haystack` — السلسلة النصية التي يُجرى فيها البحث. [`String`](/ar/reference/data-types/string) أو [`FixedString`](/ar/reference/data-types/fixedstring)
* `pattern` — نمط `LIKE` المستخدم للمطابقة. يمكن أن يحتوي على `%` (يطابق أي عدد من المحارف)، و`_` (يطابق محرفًا واحدًا)، و`\` كحرف هروب. [`String`](/ar/reference/data-types/string)
* `escape_character` — سلسلة نصية اختيارية مكوّنة من محرف واحد تُستخدم كحرف هروب بدلًا من `\`. القيمة الافتراضية: `\`. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

تُعيد `1` إذا كانت السلسلة النصية تطابق نمط `LIKE`، وإلا فتُعيد `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT like('ClickHouse', '%House');
```

```response title=Response theme={null}
┌─like('ClickHouse', '%House')─┐
│                            1 │
└──────────────────────────────┘
```

**محرف بدل لحرف واحد**

```sql title=Query theme={null}
SELECT like('ClickHouse', 'Click_ouse');
```

```response title=Response theme={null}
┌─like('ClickH⋯lick_ouse')─┐
│                        1 │
└──────────────────────────┘
```

**نمط لا يتطابق**

```sql title=Query theme={null}
SELECT like('ClickHouse', '%SQL%');
```

```response title=Response theme={null}
┌─like('ClickHouse', '%SQL%')─┐
│                           0 │
└─────────────────────────────┘
```

**بند ESCAPE**

```sql title=Query theme={null}
SELECT '50%off' LIKE '50#%off' ESCAPE '#';
```

```response title=Response theme={null}
┌─like('50%off', '50#%off', '#')─┐
│                              1 │
└────────────────────────────────┘
```

<div id="locate">
  ## locate
</div>

أُضيفت في: v18.16.0

مثل [`position`](#position)، ولكن مع تبديل الوسيطين `haystack` و`locate`.

<Info>
  **سلوك يعتمد على الإصدار**

  يعتمد سلوك هذه الدالة على إصدار ClickHouse:

  * في الإصدارات \< v24.3، كانت `locate` اسمًا مستعارًا للدالة `position`، وكانت تقبل الوسائط `(haystack, needle[, start_pos])`.
  * في الإصدارات >= 24.3، أصبحت `locate` دالة مستقلة (لتحقيق توافق أفضل مع MySQL)، وتقبل الوسائط `(needle, haystack[, start_pos])`.
    يمكن استعادة السلوك السابق باستخدام الإعداد `function_locate_has_mysql_compatible_argument_order = false`.
</Info>

**الصياغة**

```sql theme={null}
locate(needle, haystack[, start_pos])
```

**الوسيطات**

* `needle` — السلسلة الفرعية المطلوب البحث عنها. [`String`](/ar/reference/data-types/string)
* `haystack` — السلسلة التي يُجرى فيها البحث. [`String`](/ar/reference/data-types/string) أو [`Enum`](/ar/reference/data-types/enum)
* `start_pos` — اختياري. الموضع في `haystack` الذي يبدأ منه البحث (مع بدء العد من 1). [`UInt`](/ar/reference/data-types/int-uint)

**القيمة المُعادة**

يعيد موضع البداية محسوبًا بالبايتات، بدءًا من 1، إذا عُثر على السلسلة الفرعية، و`0` إذا لم يُعثر عليها. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**الاستخدام الأساسي**

```sql title=Query theme={null}
SELECT locate('ca', 'abcabc')
```

```response title=Response theme={null}
┌─locate('ca', 'abcabc')─┐
│                      3 │
└────────────────────────┘
```

<div id="match">
  ## match
</div>

أُضيف في: v1.1.0

يتحقق مما إذا كانت السلسلة النصية المُدخلة تطابق نمط التعبير النمطي المُعطى.

تستخدم هذه الدالة مكتبة RE2 للتعبيرات النمطية. يُرجى الرجوع إلى [re2](https://github.com/google/re2/wiki/Syntax) للاطلاع على الصياغة المدعومة.

تعمل المطابقة على افتراض UTF-8. فعلى سبيل المثال، يُستخدَم `¥` داخليًا على هيئة بايتين، لكن المطابقة تتعامل معه باعتباره نقطة ترميز واحدة.
يجب ألا يحتوي التعبير النمطي على بايتات NULL.
إذا لم تكن السلسلة النصية المُدخلَة أو النمط بتنسيق UTF-8 صالحين، فسيكون السلوك غير معرّف.

وعلى خلاف السلوك الافتراضي في re2، فإن `.` يطابق فواصل الأسطر. لتعطيل ذلك، أضف `(?-s)` في بداية النمط.

النمط غير مقيَّد. ولمطابقة السلسلة النصية بالكامل، قيِّد النمط بنفسك باستخدام `^` و `$`.

إذا كنت تريد فقط البحث عن سلاسل فرعية، فيمكنك استخدام الدالتين [`like`](#like) أو [`position`](#position) بدلًا من ذلك، إذ تعملان أسرع بكثير من هذه الدالة.

صياغة عامل التشغيل البديلة: `haystack REGEXP pattern`.

**الصياغة**

```sql theme={null}
match(haystack, pattern)
```

**الأسماء المستعارة**: `REGEXP_MATCHES`

**الوسيطات**

* `haystack` — سلسلة يُبحث فيها عن النمط. [`String`](/ar/reference/data-types/string)
* `pattern` — نمط تعبير نمطي. يمكن أن يكون ثابتًا أو أن يأتي من عمود. [`String`](/ar/reference/data-types/string)

**القيمة المعادة**

تُرجع `1` إذا كان هناك تطابق مع النمط، و`0` خلاف ذلك. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مطابقة الأنماط الأساسية**

```sql title=Query theme={null}
SELECT match('Hello World', 'Hello.*')
```

```response title=Response theme={null}
┌─match('Hello World', 'Hello.*')─┐
│                               1 │
└─────────────────────────────────┘
```

**النمط لا يتطابق**

```sql title=Query theme={null}
SELECT match('Hello World', 'goodbye.*')
```

```response title=Response theme={null}
┌─match('Hello World', 'goodbye.*')─┐
│                                 0 │
└───────────────────────────────────┘
```

**مطابقة جزء من سلسلة نصية**

```sql title=Query theme={null}
SELECT match('abcde', 'b.*d'), match('abcde', '^b.*d$')
```

```response title=Response theme={null}
┌─match('abcde', 'b.*d')─┬─match('abcde', '^b.*d$')─┐
│                       1 │                         0 │
└─────────────────────────┴───────────────────────────┘
```

<div id="multiFuzzyMatchAllIndices">
  ## multiFuzzyMatchAllIndices
</div>

أُضيف في: v20.1.0

يشبه [`multiFuzzyMatchAny`](#multiFuzzyMatchAny)، لكنه يعيد مصفوفة بجميع الفهارس المطابقة لـ haystack، بأي ترتيب، ضمن [مسافة تحرير](https://en.wikipedia.org/wiki/Edit_distance) ثابتة.

**الصياغة**

```sql theme={null}
multiFuzzyMatchAllIndices(haystack, distance, [pattern1, pattern2, ..., patternN])
```

**الوسيطات**

* `haystack` — سلسلة يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `distance` — الحد الأقصى لمسافة التحرير للمطابقة التقريبية. [`UInt8`](/ar/reference/data-types/int-uint)
* `pattern` — مصفوفة من الأنماط المطلوب المطابقة معها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

يعيد مصفوفة تحتوي على جميع الفهارس (بدءًا من 1) التي تطابق `haystack` ضمن مسافة التحرير المحددة، بأي ترتيب. ويعيد مصفوفة فارغة إذا لم يتم العثور على أي تطابقات. [`Array(UInt64)`](/ar/reference/data-types/array)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT multiFuzzyMatchAllIndices('ClickHouse', 2, ['ClickHouse', 'ClckHouse', 'ClickHose', 'House']);
```

```response title=Response theme={null}
┌─multiFuzzyMa⋯, 'House'])─┐
│ [3,1,4,2]                │
└──────────────────────────┘
```

<div id="multiFuzzyMatchAny">
  ## multiFuzzyMatchAny
</div>

أُضيف في: v20.1.0

مثل [`multiMatchAny`](#multiMatchAny)، لكنه يعيد القيمة 1 إذا طابق أي نمط النص ضمن [مسافة تحرير](https://en.wikipedia.org/wiki/Edit_distance) ثابتة.
تعتمد هذه الدالة على الميزة التجريبية في مكتبة [hyperscan](https://intel.github.io/hyperscan/dev-reference/compilation.html#approximate-matching)، وقد تكون بطيئة في بعض الحالات الحدّية.
يعتمد الأداء على قيمة مسافة التحرير والأنماط المستخدمة، لكنه يكون دائمًا أعلى كلفة مقارنةً بالنظائر غير التقريبية.

<Note>
  لا تدعم عائلة الدوال `multiFuzzyMatch*()` التعبيرات النمطية UTF-8 (إذ تتعامل معها كتسلسل من البايتات) بسبب قيود hyperscan.
</Note>

**البنية**

```sql theme={null}
multiFuzzyMatchAny(haystack, distance, [pattern1, pattern2, ..., patternN])
```

**المعاملات**

* `haystack` — السلسلة التي يُجرى فيها البحث. [`String`](/ar/reference/data-types/string)
* `distance` — الحد الأقصى لمسافة التحرير للمطابقة التقريبية. [`UInt8`](/ar/reference/data-types/int-uint)
* `pattern` — اختياري. مصفوفة من الأنماط للمطابقة معها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

تُرجِع `1` إذا طابق أي نمط القيمة `haystack` ضمن مسافة التحرير المحددة، وإلا فتُرجِع `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT multiFuzzyMatchAny('ClickHouse', 2, ['ClickHouse', 'ClckHouse', 'ClickHose']);
```

```response title=Response theme={null}
┌─multiFuzzyMa⋯lickHose'])─┐
│                        1 │
└──────────────────────────┘
```

<div id="multiFuzzyMatchAnyIndex">
  ## multiFuzzyMatchAnyIndex
</div>

أُضيف في: v20.1.0

مثل [`multiFuzzyMatchAny`](#multiFuzzyMatchAny)، لكنه يُرجع أي فهرس يطابق haystack ضمن [مسافة تحرير](https://en.wikipedia.org/wiki/Edit_distance) ثابتة.

**الصياغة**

```sql theme={null}
multiFuzzyMatchAnyIndex(haystack, distance, [pattern1, pattern2, ..., patternn])
```

**الوسائط**

* `haystack` — السلسلة النصية التي يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `distance` — الحد الأقصى لمسافة التحرير للمطابقة التقريبية. [`UInt8`](/ar/reference/data-types/int-uint)
* `pattern` — مصفوفة من الأنماط المطلوب المطابقة معها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

يعيد فهرس أي نمط يطابق `haystack` ضمن مسافة التحرير المحددة (بدءًا من 1)، وإلا يعيد `0`. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT multiFuzzyMatchAnyIndex('ClickHouse', 2, ['ClckHouse', 'ClickHose', 'ClickHouse']);
```

```response title=Response theme={null}
┌─multiFuzzyMa⋯ickHouse'])─┐
│                        2 │
└──────────────────────────┘
```

<div id="multiMatchAllIndices">
  ## multiMatchAllIndices
</div>

قُدِّمت في: v20.1.0

مثل [`multiMatchAny`](#multiMatchAny)، لكنها تُرجع مصفوفة بجميع الفهارس التي تطابق haystack بأي ترتيب.

**البنية**

```sql theme={null}
multiMatchAllIndices(haystack, [pattern1, pattern2, ..., patternn])
```

**الوسيطات**

* `haystack` — السلسلة التي يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `pattern` — التعبيرات النمطية المطلوب المطابقة معها. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

مصفوفة تحتوي على جميع الفهارس (بدءًا من 1) التي تطابق `haystack` بأي ترتيب. وتُرجع مصفوفة فارغة إذا لم يتم العثور على أي تطابقات. [`Array(UInt64)`](/ar/reference/data-types/array)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT multiMatchAllIndices('ClickHouse', ['[0-9]', 'House', 'Click', 'ouse']);
```

```response title=Response theme={null}
┌─multiMatchAl⋯', 'ouse'])─┐
│ [3, 2, 4]                │
└──────────────────────────┘
```

<div id="multiMatchAny">
  ## multiMatchAny
</div>

أُضيفت في: v20.1.0

تحقّق مما إذا كان واحد على الأقل من عدة أنماط للتعبيرات النمطية يطابق النص المراد البحث فيه.

إذا كنت تريد فقط البحث عن عدة سلاسل فرعية داخل سلسلة نصية، يمكنك استخدام الدالة [`multiSearchAny`](#multiSearchAny) بدلًا من ذلك، فهي أسرع بكثير من هذه الدالة.

**البنية**

```sql theme={null}
multiMatchAny(haystack, pattern1[, pattern2, ...])
```

**الوسيطات**

* `haystack` — السلسلة التي يُبحث فيها عن الأنماط. [`String`](/ar/reference/data-types/string)
* `pattern1[, pattern2, ...]` — مصفوفة تضم نمط تعبير نمطي واحدًا أو أكثر. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المُعادة**

تُرجع `1` إذا طابق أي نمط، و`0` خلاف ذلك. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مطابقة عدة أنماط**

```sql title=Query theme={null}
SELECT multiMatchAny('Hello World', ['Hello.*', 'foo.*'])
```

```response title=Response theme={null}
┌─multiMatchAny('Hello World', ['Hello.*', 'foo.*'])─┐
│                                                  1 │
└────────────────────────────────────────────────────┘
```

**لا يطابق أي نمط**

```sql title=Query theme={null}
SELECT multiMatchAny('Hello World', ['goodbye.*', 'foo.*'])
```

```response title=Response theme={null}
┌─multiMatchAny('Hello World', ['goodbye.*', 'foo.*'])─┐
│                                                    0 │
└──────────────────────────────────────────────────────┘
```

<div id="multiMatchAnyIndex">
  ## multiMatchAnyIndex
</div>

أُضيف في: v20.1.0

مثل [`multiMatchAny`](#multiMatchAny)، لكنه يُرجع فهرس أي تطابق مع `haystack`.

**الصيغة**

```sql theme={null}
multiMatchAnyIndex(haystack, [pattern1, pattern2, ..., patternn])
```

**الوسائط**

* `haystack` — سلسلة نصية يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `pattern` — تعبيرات نمطية تجري المطابقة معها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

تعيد فهرس أول نمط مطابق (ابتداءً من 1)، أو 0 إذا لم يتم العثور على أي مطابقة. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT multiMatchAnyIndex('ClickHouse', ['[0-9]', 'House', 'Click']);
```

```response title=Response theme={null}
┌─multiMatchAn⋯, 'Click'])─┐
│                        3 │
└──────────────────────────┘
```

<div id="multiSearchAllPositions">
  ## multiSearchAllPositions
</div>

أُضيف في: v20.1.0

مثل [`position`](#position)، لكنه يعيد مصفوفة من المواضع (بالبايت، بدءًا من 1) لعدة سلاسل فرعية `needle` ضمن سلسلة `haystack`.

لا تدعم جميع دوال `multiSearch*()` أكثر من 2^8 من قيم `needle`.

**الصياغة**

```sql theme={null}
multiSearchAllPositions(haystack, needle1[, needle2, ...])
```

**الوسيطات**

* `haystack` — سلسلة يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `needle1[, needle2, ...]` — مصفوفة تضم سلسلة فرعية واحدة أو أكثر للبحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

تعيد مصفوفة تحتوي على موضع البداية بالبايت، مع بدء العد من 1، إذا عُثر على السلسلة الفرعية، و`0` إذا لم يُعثر عليها. [`Array(UInt64)`](/ar/reference/data-types/array)

**أمثلة**

**البحث عن عدة سلاسل فرعية**

```sql title=Query theme={null}
SELECT multiSearchAllPositions('Hello, World!', ['hello', '!', 'world'])
```

```response title=Response theme={null}
┌─multiSearchAllPositions('Hello, World!', ['hello', '!', 'world'])─┐
│ [0,13,0]                                                          │
└───────────────────────────────────────────────────────────────────┘
```

<div id="multiSearchAllPositionsCaseInsensitive">
  ## multiSearchAllPositionsCaseInsensitive
</div>

أُضيف في: v20.1.0

يشبه [`multiSearchAllPositions`](#multiSearchAllPositions)، لكنه لا يميّز بين الأحرف الكبيرة والصغيرة.

**الصيغة**

```sql theme={null}
multiSearchAllPositionsCaseInsensitive(haystack, needle1[, needle2, ...])
```

**الوسيطات**

* `haystack` — سلسلة نصية يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `needle1[, needle2, ...]` — مصفوفة تضم سلسلة فرعية واحدة أو أكثر للبحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

تعيد مصفوفة تتضمن موضع البداية بالبايتات مع بدء العد من 1 (إذا عُثر على السلسلة الفرعية)، و`0` إذا لم يُعثر على السلسلة الفرعية. [`Array(UInt64)`](/ar/reference/data-types/array)

**أمثلة**

**بحث متعدد غير حساس لحالة الأحرف**

```sql title=Query theme={null}
SELECT multiSearchAllPositionsCaseInsensitive('ClickHouse',['c','h'])
```

```response title=Response theme={null}
┌─multiSearchA⋯['c', 'h'])─┐
│ [1,6]                    │
└──────────────────────────┘
```

<div id="multiSearchAllPositionsCaseInsensitiveUTF8">
  ## multiSearchAllPositionsCaseInsensitiveUTF8
</div>

أُضيف في: v20.1.0

مثل [`multiSearchAllPositionsUTF8`](#multiSearchAllPositionsUTF8)، لكنه يتجاهل اختلاف حالة الأحرف.

**البنية**

```sql theme={null}
multiSearchAllPositionsCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])
```

**الوسائط**

* `haystack` — سلسلة مرمّزة بترميز UTF-8 يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `needle` — سلاسل فرعية مرمّزة بترميز UTF-8 يُبحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المُعادة**

مصفوفة بمواقع البداية بالبايت، مع بدء العد من 1 (إذا عُثر على السلسلة الفرعية). وتُرجع 0 إذا لم يُعثر على السلسلة الفرعية. [`Array`](/ar/reference/data-types/array)

**أمثلة**

**بحث UTF-8 غير متأثر بحالة الأحرف**

```sql title=Query theme={null}
SELECT multiSearchAllPositionsCaseInsensitiveUTF8('Здравствуй, мир!', ['здравствуй', 'МИР']);
```

```response title=Response theme={null}
┌─multiSearchA⋯й', 'МИР'])─┐
│ [1, 13]                  │
└──────────────────────────┘
```

<div id="multiSearchAllPositionsUTF8">
  ## multiSearchAllPositionsUTF8
</div>

متوفرة منذ: v20.1.0

تشبه [`multiSearchAllPositions`](#multiSearchAllPositions)، لكنها تفترض أن `haystack` والسلاسل الفرعية `needle` عبارة عن سلاسل نصية مرمّزة بترميز UTF-8.

**الصياغة**

```sql theme={null}
multiSearchAllPositionsUTF8(haystack, needle1[, needle2, ...])
```

**الوسيطات**

* `haystack` — سلسلة مرمّزة بترميز UTF-8 يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `needle1[, needle2, ...]` — مصفوفة من السلاسل الفرعية المرمّزة بترميز UTF-8 المطلوب البحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

تعيد مصفوفة تتضمّن مواضع البداية بالبايتات، محسوبةً ابتداءً من 1 (إذا عُثر على السلسلة الفرعية)، و`0` إذا لم يُعثر على السلسلة الفرعية. [`Array`](/ar/reference/data-types/array)

**أمثلة**

**بحث متعدد في UTF-8**

```sql title=Query theme={null}
SELECT multiSearchAllPositionsUTF8('ClickHouse',['C','H'])
```

```response title=Response theme={null}
┌─multiSearchAllPositionsUTF8('ClickHouse', ['C', 'H'])─┐
│ [1,6]                                                 │
└───────────────────────────────────────────────────────┘
```

<div id="multiSearchAny">
  ## multiSearchAny
</div>

أُضيف في: v20.1.0

يتحقق مما إذا كانت واحدة على الأقل من السلاسل المطلوب البحث عنها تطابق السلسلة المراد البحث فيها.

توفّر الدوال [`multiSearchAnyCaseInsensitive`](#multiSearchAnyCaseInsensitive)، [`multiSearchAnyUTF8`](#multiSearchAnyUTF8) و[`multiSearchAnyCaseInsensitiveUTF8`](#multiSearchAnyCaseInsensitiveUTF8) صيغًا غير حساسة لحالة الأحرف و/أو صيغ UTF-8 لهذه الدالة.

**الصيغة**

```sql theme={null}
multiSearchAny(haystack, needle1[, needle2, ...])
```

**الوسيطات**

* `haystack` — السلسلة التي يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `needle1[, needle2, ...]` — مصفوفة من السلاسل الفرعية المراد البحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

يعيد `1` عند وجود مطابقة واحدة على الأقل، وإلا يعيد `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**البحث عن أي مطابقة**

```sql title=Query theme={null}
SELECT multiSearchAny('ClickHouse',['C','H'])
```

```response title=Response theme={null}
┌─multiSearchAny('ClickHouse', ['C', 'H'])─┐
│                                        1 │
└──────────────────────────────────────────┘
```

<div id="multiSearchAnyCaseInsensitive">
  ## multiSearchAnyCaseInsensitive
</div>

أُضيفت في: v20.1.0

مثل [multiSearchAny](#multiSearchAny)، لكنه يتجاهل حالة الأحرف.

**البنية**

```sql theme={null}
multiSearchAnyCaseInsensitive(haystack, [needle1, needle2, ..., needleN])
```

**الوسيطات**

* `haystack` — السلسلة التي يُجرى فيها البحث. [`String`](/ar/reference/data-types/string)
* `needle` — السلاسل الفرعية المطلوب البحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

يعيد `1` إذا وُجدت مطابقة واحدة على الأقل غير حسّاسة لحالة الأحرف، وإلا فيعيد `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**بحث غير حسّاس لحالة الأحرف**

```sql title=Query theme={null}
SELECT multiSearchAnyCaseInsensitive('ClickHouse',['c','h'])
```

```response title=Response theme={null}
┌─multiSearchAnyCaseInsensitive('ClickHouse', ['c', 'h'])─┐
│                                                       1 │
└─────────────────────────────────────────────────────────┘
```

<div id="multiSearchAnyCaseInsensitiveUTF8">
  ## multiSearchAnyCaseInsensitiveUTF8
</div>

استُحدث في: v20.1.0

مثل [multiSearchAnyUTF8](#multiSearchAnyUTF8) لكنه لا يميّز بين الأحرف الكبيرة والصغيرة.

**الصياغة**

```sql theme={null}
multiSearchAnyCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])
```

**الوسيطات**

* `haystack` — سلسلة UTF-8 يُجرى فيها البحث. [`String`](/ar/reference/data-types/string)
* `needle` — سلاسل فرعية بترميز UTF-8 يُبحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المُعادة**

تُرجع `1` إذا وُجدت مطابقة واحدة على الأقل دون حساسية لحالة الأحرف، وإلا فتُرجع `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**في سلسلة UTF-8 'Здравствуйте'، تحقّق مما إذا كان الحرف 'з' (حرفًا صغيرًا) موجودًا**

```sql title=Query theme={null}
SELECT multiSearchAnyCaseInsensitiveUTF8('Здравствуйте',['з'])
```

```response title=Response theme={null}
┌─multiSearchA⋯те', ['з'])─┐
│                        1 │
└──────────────────────────┘
```

<div id="multiSearchAnyUTF8">
  ## multiSearchAnyUTF8
</div>

أُضيفت في: v20.1.0

مثل [multiSearchAny](#multiSearchAny)، لكنها تفترض أن `haystack` والسلاسل الفرعية `needle` هي سلاسل نصية مرمّزة بترميز UTF-8.

**الصيغة**

```sql theme={null}
multiSearchAnyUTF8(haystack, [needle1, needle2, ..., needleN])
```

**الوسيطات**

* `haystack` — سلسلة UTF-8 يُجرى البحث داخلها. [`String`](/ar/reference/data-types/string)
* `needle` — سلاسل فرعية بترميز UTF-8 يُبحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المُعادة**

تُرجع `1` إذا وُجدت مطابقة واحدة على الأقل، وإلا فتُرجع `0` إذا لم توجد أي مطابقة. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**باعتبار '你好，世界' ('Hello, world') سلسلة UTF-8، تحقّق مما إذا كانت السلسلة تحتوي على أي من الحرفين 你 أو 界**

```sql title=Query theme={null}
SELECT multiSearchAnyUTF8('你好，世界', ['你', '界'])
```

```response title=Response theme={null}
┌─multiSearchA⋯你', '界'])─┐
│                        1 │
└──────────────────────────┘
```

<div id="multiSearchFirstIndex">
  ## multiSearchFirstIndex
</div>

أُضيف في: v20.1.0

يبحث عن عدة سلاسل needle داخل سلسلة haystack (مع مراعاة حالة الأحرف)، ويُرجع فهرسًا يبدأ من 1 لأول needle يتم العثور عليه.

**البنية**

```sql theme={null}
multiSearchFirstIndex(haystack, [needle1, needle2, ..., needleN])
```

**الوسائط**

* `haystack` — السلسلة النصية المطلوب البحث فيها. [`String`](/ar/reference/data-types/string)
* `needles` — مصفوفة من السلاسل النصية المطلوب البحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المُعادة**

تعيد الفهرس الذي يبدأ من 1 (أي الموضع داخل مصفوفة `needles`) لأول `needle` يُعثر عليه في `haystack`. وتعيد 0 إذا لم يتم العثور على أي من عناصر `needles`. البحث حساس لحالة الأحرف. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT multiSearchFirstIndex('ClickHouse Database', ['Click', 'Database', 'Server']);
```

```response title=Response theme={null}
┌─multiSearchF⋯ 'Server'])─┐
│                        1 │
└──────────────────────────┘
```

**السلوك المراعي لحالة الأحرف**

```sql title=Query theme={null}
SELECT multiSearchFirstIndex('ClickHouse Database', ['CLICK', 'Database', 'Server']);
```

```response title=Response theme={null}
┌─multiSearchF⋯ 'Server'])─┐
│                        2 │
└──────────────────────────┘
```

**لم يتم العثور على أي تطابق**

```sql title=Query theme={null}
SELECT multiSearchFirstIndex('Hello World', ['goodbye', 'test']);
```

```response title=Response theme={null}
┌─multiSearchF⋯', 'test'])─┐
│                        0 │
└──────────────────────────┘
```

<div id="multiSearchFirstIndexCaseInsensitive">
  ## multiSearchFirstIndexCaseInsensitive
</div>

قُدِّمت في: v20.1.0

تعيد الفهرس `i` (ابتداءً من 1) لأول `needle&#95;i` يتم العثور عليه من اليسار في السلسلة `haystack`، وتعيد 0 بخلاف ذلك.
يتجاهل حالة الأحرف.

**البنية**

```sql theme={null}
multiSearchFirstIndexCaseInsensitive(haystack, [needle1, needle2, ..., needleN]
```

**الوسيطات**

* `haystack` — السلسلة النصية التي يُجرى فيها البحث. [`String`](/ar/reference/data-types/string)
* `needle` — السلاسل الفرعية المراد البحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المُعادة**

يُرجع الفهرس (بدءًا من 1) لأول `needle` يُعثر عليه من جهة اليسار. وإذا لم توجد أي مطابقة، فستكون القيمة `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT multiSearchFirstIndexCaseInsensitive('hElLo WoRlD', ['World', 'Hello']);
```

```response title=Response theme={null}
┌─multiSearchF⋯, 'Hello'])─┐
│                        1 │
└──────────────────────────┘
```

<div id="multiSearchFirstIndexCaseInsensitiveUTF8">
  ## multiSearchFirstIndexCaseInsensitiveUTF8
</div>

أُضيفت في: v20.1.0

تبحث عن عدة سلاسل needle داخل سلسلة haystack، من دون تمييز بين الأحرف الكبيرة والصغيرة مع دعم ترميز UTF-8، وتُرجع فهرسًا يبدأ من 1 لأول needle يتم العثور عليه.

**الصيغة**

```sql theme={null}
multiSearchFirstIndexCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])
```

**الوسيطات**

* `haystack` — السلسلة النصية المطلوب البحث فيها. [`String`](/ar/reference/data-types/string)
* `needles` — مصفوفة من السلاسل النصية المطلوب البحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المُعادة**

تُرجع الفهرس ذا الأساس 1 (أي الموضع في مصفوفة `needles`) لأول سلسلة يتم العثور عليها داخل `haystack`. وتُرجع 0 إذا لم يتم العثور على أي سلسلة. البحث غير حساس لحالة الأحرف، ويراعي ترميز المحارف UTF-8. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT multiSearchFirstIndexCaseInsensitiveUTF8('ClickHouse Database', ['CLICK', 'data', 'server']);
```

```response title=Response theme={null}
┌─multiSearchF⋯ 'server'])─┐
│                        1 │
└──────────────────────────┘
```

**التعامل مع حالة الأحرف في UTF-8**

```sql title=Query theme={null}
SELECT multiSearchFirstIndexCaseInsensitiveUTF8('Привет Мир', ['мир', 'ПРИВЕТ']);
```

```response title=Response theme={null}
┌─multiSearchF⋯ 'ПРИВЕТ'])─┐
│                        1 │
└──────────────────────────┘
```

**لم يتم العثور على أي تطابق**

```sql title=Query theme={null}
SELECT multiSearchFirstIndexCaseInsensitiveUTF8('Hello World', ['goodbye', 'test']);
```

```response title=Response theme={null}
┌─multiSearchF⋯', 'test'])─┐
│                        0 │
└──────────────────────────┘
```

<div id="multiSearchFirstIndexUTF8">
  ## multiSearchFirstIndexUTF8
</div>

قُدِّمت في: v20.1.0

تُرجع الفهرس `i` (بدءًا من 1) لأول `needle&#95;i` يتم العثور عليه من أقصى اليسار في السلسلة `haystack`، وتُرجع 0 بخلاف ذلك.
وتفترض أن `haystack` و`needle` سلسلتان مرمّزتان بترميز UTF-8.

**البنية**

```sql theme={null}
multiSearchFirstIndexUTF8(haystack, [needle1, needle2, ..., needleN])
```

**الوسيطات**

* `haystack` — سلسلة UTF-8 يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `needle` — مصفوفة من السلاسل الفرعية بترميز UTF-8 المطلوب البحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

يعيد الفهرس (بدءًا من 1) لأول `needle` يتم العثور عليه من جهة اليسار. وإذا لم توجد أي مطابقة، فتكون القيمة 0. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT multiSearchFirstIndexUTF8('Здравствуйте мир', ['мир', 'здравствуйте']);
```

```response title=Response theme={null}
┌─multiSearchF⋯вствуйте'])─┐
│                        1 │
└──────────────────────────┘
```

<div id="multiSearchFirstPosition">
  ## multiSearchFirstPosition
</div>

قُدِّمت في: v20.1.0

تشبه [`position`](#position)، لكنها تُرجع الإزاحة الأولى في سلسلة `haystack` التي تطابق أيًا من سلاسل `needle` المتعددة.

توفّر الدوال [`multiSearchFirstPositionCaseInsensitive`](#multiSearchFirstPositionCaseInsensitive) و[`multiSearchFirstPositionUTF8`](#multiSearchFirstPositionUTF8) و[`multiSearchFirstPositionCaseInsensitiveUTF8`](#multiSearchFirstPositionCaseInsensitiveUTF8) أشكالًا غير حساسة لحالة الأحرف و/أو أشكال UTF-8 لهذه الدالة.

**الصياغة**

```sql theme={null}
multiSearchFirstPosition(haystack, needle1[, needle2, ...])
```

**الوسيطات**

* `haystack` — السلسلة النصية التي يُجرى فيها البحث. [`String`](/ar/reference/data-types/string)
* `needle1[, needle2, ...]` — مصفوفة تضم سلسلة فرعية واحدة أو أكثر للبحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

يعيد أول إزاحة في سلسلة `haystack` تطابق أيًا من سلاسل `needle` المتعددة، وإلا فستكون `0` إذا لم يُعثر على أي تطابق. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**البحث عن أول موضع**

```sql title=Query theme={null}
SELECT multiSearchFirstPosition('Hello World',['llo', 'Wor', 'ld'])
```

```response title=Response theme={null}
┌─multiSearchFirstPosition('Hello World', ['llo', 'Wor', 'ld'])─┐
│                                                             3 │
└───────────────────────────────────────────────────────────────┘
```

<div id="multiSearchFirstPositionCaseInsensitive">
  ## multiSearchFirstPositionCaseInsensitive
</div>

تم تقديمه في: v20.1.0

مثل [multiSearchFirstPosition](#multiSearchFirstPosition)، لكنه لا يميّز بين الأحرف الكبيرة والصغيرة.

**البنية**

```sql theme={null}
multiSearchFirstPositionCaseInsensitive(haystack, [needle1, needle2, ..., needleN])
```

**الوسيطات**

* `haystack` — السلسلة التي يُجرى فيها البحث. [`String`](/ar/reference/data-types/string)
* `needle` — مصفوفة من السلاسل الفرعية المطلوب البحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

تعيد أول إزاحة من اليسار في سلسلة `haystack` تطابق أيًّا من سلاسل `needle`. وتعيد `0` إذا لم توجد أي مطابقة. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**أول موضع دون حساسية لحالة الأحرف**

```sql title=Query theme={null}
SELECT multiSearchFirstPositionCaseInsensitive('HELLO WORLD',['wor', 'ld', 'ello'])
```

```response title=Response theme={null}
┌─multiSearchFirstPositionCaseInsensitive('HELLO WORLD', ['wor', 'ld', 'ello'])─┐
│                                                                             2 │
└───────────────────────────────────────────────────────────────────────────────┘
```

<div id="multiSearchFirstPositionCaseInsensitiveUTF8">
  ## multiSearchFirstPositionCaseInsensitiveUTF8
</div>

أُضيف في: v20.1.0

يشبه [multiSearchFirstPosition](#multiSearchFirstPosition)، لكنه يفترض أن `haystack` و`needle` سلسلتان بترميز UTF-8 ولا يميّز بين الأحرف الكبيرة والصغيرة.

**الصياغة**

```sql theme={null}
multiSearchFirstPositionCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])
```

**المعاملات**

* `haystack` — سلسلة نصية بترميز UTF-8 يُجرى البحث فيها. [`String`](/ar/reference/data-types/string)
* `needle` — مصفوفة من السلاسل الفرعية بترميز UTF-8 المطلوب البحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المعادة**

تعيد أول إزاحة في سلسلة `haystack` تطابق أيًّا من سلاسل `needle` المتعددة، مع تجاهل حالة الأحرف. وتعيد `0` إذا لم يتم العثور على أي تطابق. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**اعثر على أول إزاحة في سلسلة UTF-8 'Здравствуй, мир' ('Hello, world') تطابق أيًّا من قيم `needle` المعطاة**

```sql title=Query theme={null}
SELECT multiSearchFirstPositionCaseInsensitiveUTF8('Здравствуй, мир', ['МИР', 'вст', 'Здра'])
```

```response title=Response theme={null}
┌─multiSearchFirstPositionCaseInsensitiveUTF8('Здравствуй, мир', ['МИР', 'вст', 'Здра'])─┐
│                                                                                      1 │
└────────────────────────────────────────────────────────────────────────────────────────┘
```

<div id="multiSearchFirstPositionUTF8">
  ## multiSearchFirstPositionUTF8
</div>

أُضيفت في: v20.1.0

مثل [multiSearchFirstPosition](#multiSearchFirstPosition)، لكنه يفترض أن `haystack` و`needle` سلسلتان نصيتان بترميز UTF-8.

**البنية**

```sql theme={null}
multiSearchFirstPositionUTF8(haystack, [needle1, needle2, ..., needleN])
```

**الوسيطات**

* `haystack` — سلسلة UTF-8 يُجرى البحث ضمنها. [`String`](/ar/reference/data-types/string)
* `needle` — مصفوفة من المقاطع الفرعية بترميز UTF-8 المطلوب البحث عنها. [`Array(String)`](/ar/reference/data-types/array)

**القيمة المُعادة**

أول إزاحة في سلسلة `haystack` تطابق أيًا من سلاسل `needle` المتعددة. تُعيد `0` إذا لم توجد أي مطابقة. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**اعثر على أول إزاحة في سلسلة UTF-8 'Здравствуй, мир' ('Hello, world') تطابق أيًا من قيم `needle` المعطاة**

```sql title=Query theme={null}
SELECT multiSearchFirstPositionUTF8('Здравствуй, мир',['мир', 'вст', 'авст'])
```

```response title=Response theme={null}
┌─multiSearchFirstPositionUTF8('Здравствуй, мир', ['мир', 'вст', 'авст'])─┐
│                                                                       4 │
└─────────────────────────────────────────────────────────────────────────┘
```

<div id="ngramDistance">
  ## ngramDistance
</div>

أُضيفت في: v20.1.0

تحسب مسافة 4-gram بين سلسلتين نصيتين.
ولهذا، تحسب الفرق المتماثل بين مجموعتين متعدّدتي العناصر من 4-grams ثم تقسّمه على مجموع عدد عناصرهما.
كلما صغرت القيمة المُعادة، زاد التشابه بين السلسلتين النصيتين.

للبحث غير المتأثر بحالة الأحرف و/أو بتنسيق UTF8، استخدم الدوال [`ngramDistanceCaseInsensitive`](#ngramDistanceCaseInsensitive), [`ngramDistanceUTF8`](#ngramDistanceUTF8), [`ngramDistanceCaseInsensitiveUTF8`](#ngramDistanceCaseInsensitiveUTF8).

**البنية**

```sql theme={null}
ngramDistance(haystack, needle)
```

**الوسيطات**

* `haystack` — سلسلة نصية للمقارنة. [`String`](/ar/reference/data-types/string)
* `needle` — سلسلة نصية للمقارنة. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

يُرجع عددًا من النوع `Float32` بين `0` و`1`. وكلما صغرت القيمة المُعادة، زاد التشابه بين السلسلتين. [`Float32`](/ar/reference/data-types/float)

**أمثلة**

**حساب مسافة 4-gram**

```sql title=Query theme={null}
SELECT ngramDistance('ClickHouse', 'ClickHouses')
```

```response title=Response theme={null}
┌─ngramDistance('ClickHouse', 'ClickHouses')─┐
│                                        0.1 │
└────────────────────────────────────────────┘
```

<div id="ngramDistanceCaseInsensitive">
  ## ngramDistanceCaseInsensitive
</div>

قُدِّمت في: v20.1.0

توفّر نسخة غير حساسة لحالة الأحرف من [`ngramDistance`](#ngramDistance).
تحسب مسافة 4-gram بين سلسلتين نصيتين مع تجاهل حالة الأحرف.
كلما صغرت القيمة المُعادة، زاد التشابه بين السلسلتين النصيتين.

**الصيغة**

```sql theme={null}
ngramDistanceCaseInsensitive(haystack, needle)
```

**المعاملات**

* `haystack` — سلسلة المقارنة الأولى. [`String`](/ar/reference/data-types/string)
* `needle` — سلسلة المقارنة الثانية. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

تعيد رقمًا من النوع Float32 بين `0` و`1`. [`Float32`](/ar/reference/data-types/float)

**أمثلة**

**مسافة 4-gram بدون تمييز حالة الأحرف**

```sql title=Query theme={null}
SELECT ngramDistanceCaseInsensitive('ClickHouse','clickhouse')
```

```response title=Response theme={null}
┌─ngramDistanceCaseInsensitive('ClickHouse','clickhouse')─┐
│                                                       0 │
└─────────────────────────────────────────────────────────┘
```

<div id="ngramDistanceCaseInsensitiveUTF8">
  ## ngramDistanceCaseInsensitiveUTF8
</div>

أُضيف في: v20.1.0

يوفّر إصدار UTF-8 من [`ngramDistance`](#ngramDistance) لا يراعي حالة الأحرف.
يفترض أن السلسلتين `needle` و`haystack` مرمَّزتان بترميز UTF-8، ولا يراعي حالة الأحرف.
يحسب مسافة 3-gram بين سلسلتين بترميز UTF-8 دون مراعاة حالة الأحرف.
كلما صغرت القيمة المُعادة، زاد التشابه بين السلسلتين.

**البنية**

```sql theme={null}
ngramDistanceCaseInsensitiveUTF8(haystack, needle)
```

**الوسائط**

* `haystack` — سلسلة المقارنة الأولى المرمّزة بترميز UTF-8. [`String`](/ar/reference/data-types/string)
* `needle` — سلسلة المقارنة الثانية المرمّزة بترميز UTF-8. [`String`](/ar/reference/data-types/string)

**القيمة المعادة**

تعيد قيمة من نوع Float32 بين `0` و`1`. [`Float32`](/ar/reference/data-types/float)

**أمثلة**

**مسافة 3-gram غير الحساسة لحالة الأحرف في UTF-8**

```sql title=Query theme={null}
SELECT ngramDistanceCaseInsensitiveUTF8('abcde','CDE')
```

```response title=Response theme={null}
┌─ngramDistanceCaseInsensitiveUTF8('abcde','CDE')─┐
│                                             0.5 │
└─────────────────────────────────────────────────┘
```

<div id="ngramDistanceUTF8">
  ## ngramDistanceUTF8
</div>

قُدِّمت في: v20.1.0

يوفّر إصدار UTF-8 من [`ngramDistance`](#ngramDistance).
يفترض أن سلسلتي `needle` و`haystack` مُشفَّرتان بترميز UTF-8.
يحسب مسافة 3-gram بين سلسلتين بترميز UTF-8.
كلما كانت القيمة المُعادة أصغر، زاد التشابه بين السلسلتين.

**البنية**

```sql theme={null}
ngramDistanceUTF8(haystack, needle)
```

**الوسائط**

* `haystack` — سلسلة المقارنة الأولى المُرمَّزة بـ UTF-8. [`String`](/ar/reference/data-types/string)
* `needle` — سلسلة المقارنة الثانية المُرمَّزة بـ UTF-8. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

يعيد عددًا من نوع Float32 بين `0` و`1`. [`Float32`](/ar/reference/data-types/float)

**أمثلة**

**مسافة 3-gram بترميز UTF-8**

```sql title=Query theme={null}
SELECT ngramDistanceUTF8('abcde','cde')
```

```response title=Response theme={null}
┌─ngramDistanceUTF8('abcde','cde')─┐
│                               0.5 │
└───────────────────────────────────┘
```

<div id="ngramSearch">
  ## ngramSearch
</div>

أُضيف في: v20.1.0

يتحقق مما إذا كانت مسافة 4-gram بين سلسلتين نصيتين أقل من أو تساوي عتبة محددة.

لإجراء بحث غير حساس لحالة الأحرف أو بتنسيق UTF8 أو كليهما، استخدم الدوال `ngramSearchCaseInsensitive` و`ngramSearchUTF8` و`ngramSearchCaseInsensitiveUTF8`.

**الصيغة**

```sql theme={null}
ngramSearch(haystack, needle)
```

**الوسيطات**

* `haystack` — سلسلة نصية للمقارنة. [`String`](/ar/reference/data-types/string)
* `needle` — سلسلة نصية للمقارنة. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

تعيد `1` إذا كانت مسافة 4-gram بين السلسلتين أقل من العتبة أو تساويها (`1.0` افتراضيًا)، وإلا فتعيد `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**البحث باستخدام 4-grams**

```sql title=Query theme={null}
SELECT ngramSearch('ClickHouse', 'Click')
```

```response title=Response theme={null}
┌─ngramSearch('ClickHouse', 'Click')─┐
│                                  1 │
└────────────────────────────────────┘
```

<div id="ngramSearchCaseInsensitive">
  ## ngramSearchCaseInsensitive
</div>

أُضيفت في: v20.1.0

توفّر متغيّرًا غير حساس لحالة الأحرف من [`ngramSearch`](#ngramSearch).
تحسب الفرق غير المتماثل بين سلسلة needle وسلسلة haystack، أي عدد مقاطع n-gram في needle مطروحًا منه العدد المشترك من مقاطع n-gram، ثم يُطبَّع على عدد مقاطع n-gram في needle.
تتحقق مما إذا كانت مسافة 4-gram بين سلسلتين أقل من أو تساوي threshold محددة، مع تجاهل حالة الأحرف.

**البنية**

```sql theme={null}
ngramSearchCaseInsensitive(haystack, needle)
```

**الوسائط**

* `haystack` — سلسلة نصية للمقارنة. [`String`](/ar/reference/data-types/string)
* `needle` — سلسلة نصية للمقارنة. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

تعيد `1` إذا كانت مسافة 4-gram بين السلسلتين أقل من العتبة أو تساويها (`1.0` افتراضيًا)، وإلا فتعيد `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**بحث غير حساس لحالة الأحرف باستخدام 4-grams**

```sql title=Query theme={null}
SELECT ngramSearchCaseInsensitive('Hello World','hello')
```

```response title=Response theme={null}
┌─ngramSearchCaseInsensitive('Hello World','hello')─┐
│                                                  1 │
└────────────────────────────────────────────────────┘
```

<div id="ngramSearchCaseInsensitiveUTF8">
  ## ngramSearchCaseInsensitiveUTF8
</div>

قُدِّم في: v20.1.0

يوفّر إصدارًا من [`ngramSearch`](#ngramSearch) يعمل على UTF-8 دون تمييز بين الأحرف الكبيرة والصغيرة.
يفترض أن `haystack` و`needle` سلسلتان نصيتان بترميز UTF-8، ويتجاهل الفرق بين الأحرف الكبيرة والصغيرة.
يتحقق مما إذا كانت مسافة 3-gram بين سلسلتين نصيتين بترميز UTF-8 أقل من أو تساوي عتبة محددة، دون تمييز بين الأحرف الكبيرة والصغيرة.

**الصيغة**

```sql theme={null}
ngramSearchCaseInsensitiveUTF8(haystack, needle)
```

**الوسيطات**

* `haystack` — سلسلة بترميز UTF-8 للمقارنة. [`String`](/ar/reference/data-types/string)
* `needle` — سلسلة بترميز UTF-8 للمقارنة. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

يعيد `1` إذا كانت مسافة 3-gram بين السلسلتين أقل من العتبة أو تساويها (`1.0` افتراضيًا)، وإلا فيعيد `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**بحث UTF-8 غير حساس لحالة الأحرف باستخدام 3-grams**

```sql title=Query theme={null}
SELECT ngramSearchCaseInsensitiveUTF8('абвГДЕёжз', 'АбвгдЕЁжз')
```

```response title=Response theme={null}
┌─ngramSearchCaseInsensitiveUTF8('абвГДЕёжз', 'АбвгдЕЁжз')─┐
│                                                        1 │
└──────────────────────────────────────────────────────────┘
```

<div id="ngramSearchUTF8">
  ## ngramSearchUTF8
</div>

قُدِّمت في: v20.1.0

توفّر إصدارًا بترميز UTF-8 من `ngramSearch`.
تفترض أن `haystack` و`needle` سلسلتان نصيتان بترميز UTF-8.
يتحقق مما إذا كانت مسافة 3-gram بين سلسلتين نصيتين بترميز UTF-8 أقل من أو تساوي عتبة محددة.

**البنية**

```sql theme={null}
ngramSearchUTF8(haystack, needle)
```

**الوسائط**

* `haystack` — سلسلة بترميز UTF-8 للمقارنة. [`سلسلة`](/ar/reference/data-types/string)
* `needle` — سلسلة بترميز UTF-8 للمقارنة. [`سلسلة`](/ar/reference/data-types/string)

**القيمة المُعادة**

يُرجع `1` إذا كانت مسافة 3-gram بين السلسلتين أقل من العتبة أو تساويها (`1.0` افتراضيًا)، وإلا فيُرجع `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**البحث في UTF-8 باستخدام 3-grams**

```sql title=Query theme={null}
SELECT ngramSearchUTF8('абвгдеёжз', 'гдеёзд')
```

```response title=Response theme={null}
┌─ngramSearchUTF8('абвгдеёжз', 'гдеёзд')─┐
│                                      1 │
└────────────────────────────────────────┘
```

<div id="notILike">
  ## notILike
</div>

أُتيح في: v20.6.0

يتحقق مما إذا كانت السلسلة النصية لا تطابق نمطًا، مع تجاهل حالة الأحرف. يمكن أن يحتوي النمط على المحرفين الخاصين `%` و `_` لمطابقة SQL LIKE. ويدعم عبارة `ESCAPE` الاختيارية (راجع `like`).

**البنية**

```sql theme={null}
notILike(haystack, pattern[, escape_character])
-- haystack NOT ILIKE pattern [ESCAPE 'escape_character']
```

**الوسيطات**

* `haystack` — سلسلة الإدخال المراد البحث فيها. [`String`](/ar/reference/data-types/string) أو [`FixedString`](/ar/reference/data-types/fixedstring)
* `pattern` — نمط SQL LIKE المراد مطابقته. يطابق `%` أي عدد من المحارف (بما في ذلك الصفر)، ويطابق `_` محرفًا واحدًا فقط. [`String`](/ar/reference/data-types/string)
* `escape_character` — سلسلة اختيارية من محرف واحد تُستخدَم كمحرف هروب بدلًا من `\`. القيمة الافتراضية: `\`. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

تعيد `1` إذا كانت السلسلة لا تطابق النمط (من دون حساسية لحالة الأحرف)، وإلا فتعيد `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT notILike('ClickHouse', '%house%');
```

```response title=Response theme={null}
┌─notILike('Cl⋯ '%house%')─┐
│                        0 │
└──────────────────────────┘
```

<div id="notLike">
  ## notLike
</div>

أُضيف في: v1.1.0

مماثلة لـ [`like`](#like)، لكنها تنفي النتيجة. وتدعم بند `ESCAPE` الاختياري (راجع `like`).

**الصيغة**

```sql theme={null}
notLike(haystack, pattern[, escape_character])
-- haystack NOT LIKE pattern [ESCAPE 'escape_character']
```

**الوسيطات**

* `haystack` — السلسلة التي يُجرى فيها البحث. [`String`](/ar/reference/data-types/string) أو [`FixedString`](/ar/reference/data-types/fixedstring)
* `pattern` — نمط `LIKE` المراد مطابقته. [`String`](/ar/reference/data-types/string)
* `escape_character` — سلسلة اختيارية مكوّنة من محرف واحد تُستخدم كمحرف هروب بدلًا من `\`. القيمة الافتراضية: `\`. [`String`](/ar/reference/data-types/string)

**القيمة المعادة**

تُرجع `1` إذا كانت السلسلة لا تطابق نمط `LIKE`، وإلا فتُرجع `0`. [`UInt8`](/ar/reference/data-types/int-uint)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
SELECT notLike('ClickHouse', '%House%');
```

```response title=Response theme={null}
┌─notLike('Cli⋯ '%House%')─┐
│                        0 │
└──────────────────────────┘
```

**نمط غير متطابق**

```sql title=Query theme={null}
SELECT notLike('ClickHouse', '%SQL%');
```

```response title=Response theme={null}
┌─notLike('Cli⋯', '%SQL%')─┐
│                        1 │
└──────────────────────────┘
```

<div id="position">
  ## position
</div>

أُضيف في: v1.1.0

يعيد موضع السلسلة الفرعية `needle` داخل السلسلة `haystack` (بالبايتات، بدءًا من 1).

إذا كانت السلسلة الفرعية `needle` فارغة، فتُطبَّق القواعد التالية:

* إذا لم يتم تحديد `start_pos`: فأعد `1`
* إذا كان `start_pos = 0`: فأعد `1`
* إذا كان `start_pos >= 1` و`start_pos <= length(haystack) + 1`: فأعد `start_pos`
* بخلاف ذلك: فأعد `0`

تنطبق القواعد نفسها أيضًا على الدوال [`locate`](#locate)، و[`positionCaseInsensitive`](#positionCaseInsensitive)، و[`positionUTF8`](#positionUTF8)، و[`positionCaseInsensitiveUTF8`](#positionCaseInsensitiveUTF8).

**الصيغة**

```sql theme={null}
position(haystack, needle[, start_pos])
```

**الوسيطات**

* `haystack` — السلسلة التي يُجرى البحث فيها. [`String`](/ar/reference/data-types/string) أو [`Enum`](/ar/reference/data-types/enum)
* `needle` — السلسلة الفرعية المراد البحث عنها. [`String`](/ar/reference/data-types/string)
* `start_pos` — الموضع في `haystack` الذي يبدأ منه البحث (بترقيم يبدأ من 1). اختياري. [`UInt`](/ar/reference/data-types/int-uint)

**القيمة المعادة**

يعيد موضع البداية بالبايت، مع العد بدءًا من 1، إذا عُثر على السلسلة الفرعية، وإلا فتكون القيمة `0` إذا لم يُعثر عليها. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**الاستخدام الأساسي**

```sql title=Query theme={null}
SELECT position('Hello, world!', '!')
```

```response title=Response theme={null}
┌─position('Hello, world!', '!')─┐
│                             13 │
└────────────────────────────────┘
```

**مع الوسيطة start\_pos**

```sql title=Query theme={null}
SELECT position('Hello, world!', 'o', 1), position('Hello, world!', 'o', 7)
```

```response title=Response theme={null}
┌─position('Hello, world!', 'o', 1)─┬─position('Hello, world!', 'o', 7)─┐
│                                 5 │                                 9 │
└───────────────────────────────────┴───────────────────────────────────┘
```

**صيغة needle IN haystack**

```sql title=Query theme={null}
SELECT 6 = position('/' IN s) FROM (SELECT 'Hello/World' AS s)
```

```response title=Response theme={null}
┌─equals(6, position(s, '/'))─┐
│                           1 │
└─────────────────────────────┘
```

**سلسلة فرعية لعبارة البحث الفارغة**

```sql title=Query theme={null}
SELECT position('abc', ''), position('abc', '', 0), position('abc', '', 1), position('abc', '', 2), position('abc', '', 3), position('abc', '', 4), position('abc', '', 5)
```

```response title=Response theme={null}
┌─position('abc', '')─┬─position('abc', '', 0)─┬─position('abc', '', 1)─┬─position('abc', '', 2)─┬─position('abc', '', 3)─┬─position('abc', '', 4)─┬─position('abc', '', 5)─┐
│                   1 │                      1 │                      1 │                      2 │                      3 │                      4 │                      0 │
└─────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┘
```

<div id="positionCaseInsensitive">
  ## positionCaseInsensitive
</div>

أُضيف في: v1.1.0

مثل [`position`](#position)، لكنه غير حساس لحالة الأحرف.

**الصيغة**

```sql theme={null}
positionCaseInsensitive(haystack, needle[, start_pos])
```

**الأسماء المستعارة**: `instr`

**الوسيطات**

* `haystack` — السلسلة التي يُجرى البحث فيها. [`String`](/ar/reference/data-types/string) أو [`Enum`](/ar/reference/data-types/enum)
* `needle` — السلسلة الفرعية المطلوب البحث عنها. [`String`](/ar/reference/data-types/string)
* `start_pos` — اختياري. الموضع (مع احتساب المواضع بدءًا من 1) في `haystack` الذي يبدأ منه البحث. [`UInt*`](/ar/reference/data-types/int-uint)

**القيمة المُعادة**

تعيد موضع البداية بالبايتات، مع احتساب المواضع بدءًا من 1، إذا عُثر على السلسلة الفرعية، وإلا فتعيد `0`. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**بحث غير حساس لحالة الأحرف**

```sql title=Query theme={null}
SELECT positionCaseInsensitive('Hello, world!', 'hello')
```

```response title=Response theme={null}
┌─positionCaseInsensitive('Hello, world!', 'hello')─┐
│                                                 1 │
└───────────────────────────────────────────────────┘
```

<div id="positionCaseInsensitiveUTF8">
  ## positionCaseInsensitiveUTF8
</div>

أُضيفت في: v1.1.0

مثل [`positionUTF8`](#positionUTF8)، لكنها تبحث مع تجاهل حالة الأحرف.

**الصيغة**

```sql theme={null}
positionCaseInsensitiveUTF8(haystack, needle[, start_pos])
```

**المعاملات**

* `haystack` — السلسلة التي يُجرى البحث فيها. [`String`](/ar/reference/data-types/string) أو [`Enum`](/ar/reference/data-types/enum)
* `needle` — السلسلة الفرعية المراد البحث عنها. [`String`](/ar/reference/data-types/string)
* `start_pos` — اختياري. الموضع في `haystack` الذي يبدأ منه البحث (مع احتساب الموضع الأول على أنه 1). [`UInt*`](/ar/reference/data-types/int-uint)

**القيمة المُعادة**

تعيد موضع البداية بالبايتات مع العد ابتداءً من 1 إذا عُثر على السلسلة الفرعية، وإلا فتعيد `0` إذا لم يُعثر عليها. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**بحث UTF-8 غير حساس لحالة الأحرف**

```sql title=Query theme={null}
SELECT positionCaseInsensitiveUTF8('Привет мир', 'МИР')
```

```response title=Response theme={null}
┌─positionCaseInsensitiveUTF8('Привет мир', 'МИР')─┐
│                                                8 │
└──────────────────────────────────────────────────┘
```

<div id="positionUTF8">
  ## positionUTF8
</div>

أُضيف في: v1.1.0

يشبه [`position`](#position)، لكنه يفترض أن `haystack` و`needle` سلسلتان نصيتان مرمّزتان بترميز UTF-8.

**الصيغة**

```sql theme={null}
positionUTF8(haystack, needle[, start_pos])
```

**الوسيطات**

* `haystack` — السلسلة التي يُجرى البحث فيها. [`String`](/ar/reference/data-types/string) أو [`Enum`](/ar/reference/data-types/enum)
* `needle` — السلسلة الفرعية المراد البحث عنها. [`String`](/ar/reference/data-types/string)
* `start_pos` — اختياري. الموضع في `haystack` الذي يبدأ منه البحث (مع بدء العد من 1). [`UInt*`](/ar/reference/data-types/int-uint)

**القيمة المُعادة**

يُرجع موضع البداية بالبايتات مع احتساب المواضع ابتداءً من 1 إذا عُثر على السلسلة الفرعية، وإلا فستكون القيمة `0` إذا لم يُعثر عليها. [`UInt64`](/ar/reference/data-types/int-uint)

**أمثلة**

**عدّ محارف UTF-8**

```sql title=Query theme={null}
SELECT positionUTF8('Motörhead', 'r')
```

```response title=Response theme={null}
┌─position('Motörhead', 'r')─┐
│                          5 │
└────────────────────────────┘
```
