توابع عددی و رشتهای SQL
ادامهٔ توابع عددی SQL
ABS(X)
تابع ABS() قدر مطلق X را برمیگرداند.
SQL> SELECT ABS(2); -- 2
SQL> SELECT ABS(-2); -- 2
ACOS(X)
آرککسینوس X را برمیگرداند. مقدار X باید بین منفی ۱ و ۱ باشد؛ در غیر این صورت خروجی NULL است.
SQL> SELECT ACOS(1);
-- 0.000000
ASIN(X)
آرکسینوس X را برمیگرداند و برای ورودی خارج از بازهٔ منفی ۱ تا ۱، NULL میدهد.
SQL> SELECT ASIN(1);
-- 1.5707963267949
ATAN(X) و ATAN2(Y,X)
ATAN() آرکتانژانت X را برمیگرداند. ATAN2(Y,X) آرکتانژانت دو آرگومان را محاسبه میکند و برای تعیین ربع نتیجه، علامت هر دو آرگومان را در نظر میگیرد.
SQL> SELECT ATAN(1);
-- 0.78539816339745
SQL> SELECT ATAN2(3,6);
-- 0.46364760900081
BIT_AND(expression)
BIT_AND AND بیتی همهٔ بیتهای عبارت را برمیگرداند. متن منبع توضیح میدهد که اگر بیتهای متناظر هر دو ۱ باشند نتیجهٔ آن بیت ۱ است و در غیر این صورت ۰. خروجی یک عدد صحیح ۶۴بیتی است؛ اگر هیچ ردیفی برای تجمیع وجود نداشته باشد، مقدار 18446744073709551615 برگردانده میشود.
SQL> SELECT MAKER, BIT_AND(PRICE) BITS
FROM CARS GROUP BY MAKER;
CHRYSLER 512
FORD 12488
HONDA 2144
BIT_COUNT(numeric_value)
تعداد بیتهای فعال در مقدار عددی را برمیگرداند.
SQL> SELECT BIT_COUNT(2) AS TWO,
BIT_COUNT(4) AS FOUR,
BIT_COUNT(7) AS SEVEN;
-- 1 | 1 | 3
BIT_OR(expression)
BIT_OR() OR بیتی همهٔ بیتهای عبارت را محاسبه و یک عدد صحیح ۶۴بیتی برمیگرداند؛ اگر هیچ سطر منطبقی نباشد، نتیجه ۰ است.
SQL> SELECT MAKER, BIT_OR(PRICE) BITS
FROM CARS GROUP BY MAKER;
CHRYSLER 62293
FORD 16127
HONDA 32766
CEIL(X) و CEILING(X)
کوچکترین عدد صحیحی را برمیگردانند که از X کوچکتر نیست.
SQL> SELECT CEILING(3.46); -- 4
SQL> SELECT CEIL(-6.43); -- -6
CONV(N, from_base, to_base)
عدد N را از مبنای from_base به to_base تبدیل و نتیجه را به صورت رشته برمیگرداند. کمینهٔ مبنا ۲ و بیشینه ۳۶ است. اگر هر آرگومان NULL باشد، نتیجه نیز NULL است.
SQL> SELECT CONV(5,16,2);
-- 101
COS(X)، COT(X)، DEGREES(X) و EXP(X)
COS() کسینوس مقدار رادیانی، COT() کتانژانت، DEGREES() تبدیل رادیان به درجه و EXP() مقدار e به توان آرگومان را برمیگرداند.
SQL> SELECT COS(90); -- -0.44807361612917
SQL> SELECT COT(1); -- 0.64209261593433
SQL> SELECT DEGREES(PI()); -- 180.000000
SQL> SELECT EXP(3); -- 20.085537
FLOOR(X)
بزرگترین عدد صحیحی را برمیگرداند که از X بزرگتر نیست.
SQL> SELECT FLOOR(7.55);
-- 7
FORMAT(X,D)
عدد X را در قالبی مانند ###,###,###.## و با D رقم اعشار قالببندی میکند.
SQL> SELECT FORMAT(423423234.65434453,2);
-- 423,423,234.65
GREATEST(n1,n2,...)
بزرگترین مقدار میان آرگومانهای ورودی را برمیگرداند.
SQL> SELECT GREATEST(3,5,1,8,33,99,34,55,67,43);
-- 99
INTERVAL(N,N1,N2,N3,...)
N را با فهرست مرتبشدهٔ مقادیر مقایسه میکند. اگر N < N1 باشد ۰، اگر N < N2 باشد ۱ و به همین ترتیب برمیگرداند؛ اگر N برابر NULL باشد نتیجه منفی ۱ است. فهرست باید به ترتیب صعودی باشد.
SQL> SELECT INTERVAL(6,1,2,3,4,5,6,7,8,9,10);
-- 6
متن منبع یادآور میشود که ۶ اندیس صفرمبنا برای نخستین مقدار بزرگتر از N است؛ در این مثال آن مقدار ۷ است.
LEAST(N1,N2,...)
برعکس GREATEST()، کوچکترین مقدار را از فهرست ورودی برمیگرداند.
SQL> SELECT LEAST(3,5,1,8,33,99,34,55,67,43);
-- 1
LOG(X)، LOG(B,X) و LOG10(X)
شکل یکآرگومانی LOG() لگاریتم طبیعی X را برمیگرداند. شکل دوآرگومانی لگاریتم X در مبنای B و LOG10() لگاریتم پایهٔ ۱۰ را محاسبه میکند.
SQL> SELECT LOG(45); -- 3.806662
SQL> SELECT LOG(2,65536); -- 16.000000
SQL> SELECT LOG10(100); -- 2.000000
MOD(N,M)
باقیماندهٔ تقسیم N بر M را برمیگرداند.
SQL> SELECT MOD(29,3);
-- 2
OCT(N)
نمایش رشتهای مقدار هشتهشتی N را برمیگرداند و معادل CONV(N,10,8) است.
SQL> SELECT OCT(12);
-- 14
PI()
مقدار عدد پی را برمیگرداند. متن منبع میگوید SQL مقدار کامل با دقت double را درونی نگه میدارد.
SQL> SELECT PI();
-- 3.141593
POW(X,Y) و POWER(X,Y)
X را به توان Y میرسانند.
SQL> SELECT POWER(3,3);
-- 27
RADIANS(X)
درجه را به رادیان تبدیل میکند.
SQL> SELECT RADIANS(90);
-- 1.570796
ROUND(X) و ROUND(X,D)
بدون آرگومان دوم، X را به نزدیکترین عدد صحیح گرد میکند. با D، نتیجه تا D رقم اعشار گرد میشود.
SQL> SELECT ROUND(5.693893); -- 6
SQL> SELECT ROUND(5.693893,2); -- 5.69
SIGN(X)
علامت مقدار را به صورت منفی ۱، صفر یا ۱ برمیگرداند.
SQL> SELECT SIGN(-4.65); -- -1
SQL> SELECT SIGN(0); -- 0
SQL> SELECT SIGN(4.65); -- 1
SIN(X)
سینوس آرگومان رادیانی را برمیگرداند.
SQL> SELECT SIN(90);
-- 0.893997
SQRT(X)
ریشهٔ دوم نامنفی X را برمیگرداند.
SQL> SELECT SQRT(49);
-- 7
STD(expression) و STDDEV(expression)
انحراف معیار عبارت را برمیگردانند. متن منبع STD() را معادل ریشهٔ دوم VARIANCE() معرفی میکند.
SQL> SELECT STD(PRICE) STD_DEVIATION FROM CARS;
-- 7650.2146
TAN(X)
تانژانت آرگومان بر حسب رادیان را برمیگرداند.
SQL> SELECT TAN(45);
-- 1.619775
TRUNCATE(X,D)
X را تا D رقم اعشار قطع میکند. اگر D=0 باشد بخش اعشاری حذف میشود؛ اگر D منفی باشد، به همان تعداد رقم از سمت بخش صحیح قطع میشود.
SQL> SELECT TRUNCATE(7.536432,2);
-- 7.53
توابع رشتهای SQL
توابع رشتهای عمدتاً برای دستکاری رشتهها بهکار میروند. فهرست منبع شامل توابع زیر است: ASCII، BIN، BIT_LENGTH، CHAR_LENGTH، CHAR، CHARACTER_LENGTH، CONCAT_WS، CONCAT، CONV، ELT، EXPORT_SET، FIELD، FIND_IN_SET، FORMAT، HEX، INSERT، INSTR، LCASE، LEFT، LENGTH، LOAD_FILE، LOCATE، LOWER، LPAD، LTRIM، MAKE_SET، MID، OCT، OCTET_LENGTH، ORD، POSITION، QUOTE، REGEXP، REPEAT، REPLACE، REVERSE، RIGHT، RPAD، RTRIM، SOUNDEX، SOUNDS LIKE، SPACE، STRCMP، SUBSTRING_INDEX، SUBSTRING/SUBSTR، TRIM، UCASE، UNHEX و UPPER.
ASCII(str)
مقدار عددی چپترین نویسهٔ رشته را برمیگرداند؛ برای رشتهٔ خالی ۰ و برای NULL مقدار NULL میدهد. در متن منبع برای کدهای ۰ تا ۲۵۵ معرفی شده است.
SQL> SELECT ASCII('2'); -- 50
SQL> SELECT ASCII('dx'); -- 100
BIN(N)
نمایش دودویی رشتهای N را برمیگرداند و معادل CONV(N,10,2) است.
SQL> SELECT BIN(12);
-- 1100
BIT_LENGTH(str)
طول رشته را بر حسب بیت برمیگرداند.
SQL> SELECT BIT_LENGTH('text');
-- 32
CHAR(N,... [USING charset_name])
هر آرگومان عددی را به کد نویسه تفسیر کرده و رشتهای از نویسههای متناظر میسازد؛ آرگومانهای NULL نادیده گرفته میشوند.
SQL> SELECT CHAR(77,121,83,81,'76');
-- MySQL
CHAR_LENGTH(str) و CHARACTER_LENGTH(str)
CHAR_LENGTH() طول رشته را بر حسب تعداد نویسه اندازه میگیرد. یک نویسهٔ چندبایتی یک نویسه محسوب میشود؛ در نتیجه رشتهای شامل پنج نویسهٔ دوبایتی برای LENGTH() طول ۱۰ و برای CHAR_LENGTH() طول ۵ دارد. CHARACTER_LENGTH() مترادف آن است.
SQL> SELECT CHAR_LENGTH("text");
-- 4
CONCAT(str1,str2,...)
رشتهٔ حاصل از اتصال آرگومانها را برمیگرداند. اگر همهٔ آرگومانها غیردودویی باشند، نتیجه رشتهٔ غیردودویی است؛ وجود آرگومان دودویی نتیجه را دودویی میکند. آرگومان عددی به نمایش رشتهای متناظر تبدیل میشود.
SQL> SELECT CONCAT('My', 'S', 'QL');
-- MySQL
CONCAT_WS(separator,str1,str2,...)
شکل «اتصال با جداکننده» از CONCAT() است. آرگومان نخست جداکنندهای است که میان رشتههای بعدی قرار میگیرد. اگر جداکننده NULL باشد، نتیجه NULL است.
SQL> SELECT CONCAT_WS(',','First name','Last Name');
-- First name,Last Name
CONV(N,from_base,to_base)
عدد را میان مبناهای ۲ تا ۳۶ تبدیل میکند و نتیجه را به صورت رشته برمیگرداند. اگر to_base منفی باشد، N عدد علامتدار و در غیر این صورت بدون علامت در نظر گرفته میشود؛ دقت تابع ۶۴بیتی است.
SQL> SELECT CONV('a',16,2);
-- 1010
ELT(N,str1,str2,...)
اگر N=1 باشد str1، اگر ۲ باشد str2 و به همین ترتیب برمیگرداند. اگر N کمتر از ۱ یا بیشتر از تعداد آرگومانها باشد، خروجی NULL است. ELT() مکمل FIELD() است.
SQL> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
-- ej
EXPORT_SET(bits,on,off[,separator[,number_of_bits]])
برای هر بیت تنظیمشده در bits رشتهٔ on و برای هر بیت تنظیمنشده رشتهٔ off را میسازد. بیتها از کمارزش به پرارزش بررسی و رشتههای نتیجه از چپ به راست با جداکننده قرار میگیرند. جداکنندهٔ پیشفرض ویرگول و تعداد بیتهای پیشفرض ۶۴ است.
SQL> SELECT EXPORT_SET(5,'Y','N',',',4);
-- Y,N,Y,N
FIELD(str,str1,str2,...) و FIND_IN_SET(str,strlist)
FIELD() موقعیت یکمبنای str را در فهرست آرگومانهای بعدی میدهد و اگر پیدا نشود ۰ برمیگرداند. FIND_IN_SET() موقعیت رشته را در فهرست جداشده با ویرگول برمیگرداند.
SQL> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-- 2
SQL> SELECT FIND_IN_SET('b','a,b,c,d');
-- 2
FORMAT(X,D)
عدد را با جداکنندهٔ هزارگان و D رقم اعشار قالببندی میکند و نتیجه را بهصورت رشته میدهد. اگر D=0 باشد، بخش اعشاری وجود ندارد.
SQL> SELECT FORMAT(12332.123456, 4);
-- 12,332.1235
HEX(N_or_S)
اگر آرگومان عدد باشد، نمایش هگزادسیمال آن را برمیگرداند و معادل CONV(N,10,16) است. اگر آرگومان رشته باشد، هر نویسه به دو رقم هگزادسیمال تبدیل میشود.
SQL> SELECT HEX(255); -- FF
SQL> SELECT 0x616263; -- abc
INSERT(str,pos,len,newstr)
بخشی از str را که از موقعیت pos و به طول len شروع میشود با newstr جایگزین میکند. اگر pos بیرون طول رشته باشد، رشتهٔ اصلی برگردانده میشود؛ اگر len از بخش باقیمانده بزرگتر باشد، بقیهٔ رشته از pos جایگزین میشود. وجود هر آرگومان NULL نتیجهٔ NULL میدهد.
SQL> SELECT INSERT('Quadratic', 3, 4, 'What');
-- QuWhattic
INSTR(str,substr)
موقعیت نخستین رخداد زیررشته را برمیگرداند و معادل شکل دوآرگومانی LOCATE() با ترتیب آرگومان معکوس است.
SQL> SELECT INSTR('foobarbar', 'bar');
-- 4
LCASE(str)، LEFT(str,len) و LENGTH(str)
LCASE() مترادف LOWER() است. LEFT() تعداد مشخصی نویسه از سمت چپ را برمیگرداند. LENGTH() طول رشته را بر حسب بایت محاسبه میکند و در رشتهٔ چندبایتی میتواند از تعداد نویسه بیشتر باشد.
SQL> SELECT LEFT('foobarbar', 5); -- fooba
SQL> SELECT LENGTH('text'); -- 4
LOAD_FILE(file_name)
فایل را میخواند و محتوا را به صورت رشته برمیگرداند. طبق متن منبع، فایل باید روی میزبان سرور باشد، مسیر کامل مشخص شود، کاربر مجوز FILE داشته باشد، فایل قابل خواندن باشد و اندازهٔ آن کمتر از max_allowed_packet باشد. اگر یکی از این شرطها برقرار نباشد، نتیجه NULL است. متن منبع همچنین میگوید از نسخهٔ 5.0.19، متغیر character_set_filesystem در تفسیر نام فایلهای Literal نقش دارد.
SQL> UPDATE table_test
-> SET blob_col=LOAD_FILE('/tmp/picture')
-> WHERE id=1;
LOCATE(substr,str[,pos])
شکل نخست موقعیت نخستین رخداد substr در str را میدهد. شکل دوم جستوجو را از موقعیت pos آغاز میکند. اگر زیررشته پیدا نشود، ۰ برمیگرداند.
SQL> SELECT LOCATE('bar', 'foobarbar');
-- 4
LOWER(str)، LPAD(str,len,padstr) و LTRIM(str)
LOWER() نویسهها را بر اساس نگاشت مجموعهنویسه به حروف کوچک تبدیل میکند. LPAD() رشته را از چپ با padstr تا طول len پر میکند و اگر رشته بلندتر باشد کوتاه میشود. LTRIM() فاصلههای ابتدای رشته را حذف میکند.
SQL> SELECT LOWER('QUADRATICALLY'); -- quadratically
SQL> SELECT LPAD('hi',4,'??'); -- ??hi
SQL> SELECT LTRIM(' barbar'); -- barbar
MAKE_SET(bits,str1,str2,...)
رشتههای متناظر با بیتهای تنظیمشده در bits را به صورت مجموعهای جداشده با ویرگول برمیگرداند؛ str1 متناظر بیت صفر، str2 بیت ۱ و ... است و آرگومانهای NULL به نتیجه افزوده نمیشوند.
SQL> SELECT MAKE_SET(1,'a','b','c');
-- a
MID(str,pos,len)، OCT(N) و OCTET_LENGTH(str)
MID(str,pos,len) مترادف SUBSTRING(str,pos,len)، OCT() نمایش هشتهشتی و OCTET_LENGTH() مترادف LENGTH() است.
SQL> SELECT OCT(12);
-- 14
ORD(str)
اگر چپترین نویسه چندبایتی باشد، کد آن را با ترکیب مقدار عددی بایتهای تشکیلدهنده محاسبه میکند؛ در غیر این صورت همان مقدار ASCII() را میدهد.
(1st byte code)
+ (2nd byte code * 256)
+ (3rd byte code * 256^2) ...
SQL> SELECT ORD('2');
-- 50
POSITION(substr IN str)
مترادف LOCATE(substr,str) است.
QUOTE(str)
رشته را برای استفاده بهعنوان مقدار دادهٔ Escapeشده در دستور SQL نقلقول میکند. نتیجه داخل تککوتیشن قرار میگیرد و تککوتیشن، بکاسلش، ASCII NUL و Control-Z با بکاسلش Escape میشوند. برای آرگومان NULL، واژهٔ NULL بدون تککوتیشن برگردانده میشود.
SQL> SELECT QUOTE('Don\'t!');
-- 'Don\'t!'
expr REGEXP pattern
عبارت را با الگوی عبارت منظم (Regular Expression) تطبیق میدهد؛ در صورت تطبیق ۱ و در غیر این صورت ۰ برمیگرداند. اگر هر آرگومان NULL باشد، نتیجه NULL است. متن منبع میگوید REGEXP جز در رشتههای دودویی نسبت به بزرگی و کوچکی حروف حساس نیست.
SQL> SELECT 'ABCDEF' REGEXP 'A%C%%'; -- 0
SQL> SELECT 'ABCDE' REGEXP '.*'; -- 1
SQL> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line'; -- 1
REPEAT(str,count)
رشته را count بار تکرار میکند. اگر تعداد کمتر از ۱ باشد رشتهٔ خالی و اگر هر آرگومان NULL باشد NULL برمیگرداند.
SQL> SELECT REPEAT('SQL', 3);
-- SQLSQLSQL
REPLACE(str,from_str,to_str)
تمام رخدادهای from_str را با to_str جایگزین میکند و جستوجوی آن نسبت به بزرگی و کوچکی حروف حساس است.
SQL> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
-- WwWwWw.mysql.com
REVERSE(str)
ترتیب نویسههای رشته را معکوس میکند.
SQL> SELECT REVERSE('abcd');
-- dcba
RIGHT(str,len) و RPAD(str,len,padstr)
RIGHT() تعداد مشخصی نویسه از سمت راست را برمیگرداند. RPAD() رشته را از سمت راست با رشتهٔ پرکننده تا طول مشخص تکمیل میکند و اگر رشتهٔ اصلی بلندتر باشد آن را به طول تعیینشده کوتاه میکند.
SQL> SELECT RIGHT('foobarbar', 4); -- rbar
SQL> SELECT RPAD('hi',5,'?'); -- hi???
RTRIM(str)
فاصلههای انتهای رشته را حذف میکند.
SQL> SELECT RTRIM('barbar ');
-- barbar
SOUNDEX(str) و SOUNDS LIKE
SOUNDEX() کد آوایی رشته را برمیگرداند. دو رشته با تلفظ تقریباً یکسان باید کدهای Soundex مشابهی داشته باشند. کد استاندارد Soundex چهار نویسهای است، اما تابع منبع میتواند رشتهٔ طولانیتری برگرداند و میتوان با SUBSTRING() چهار نویسهٔ لازم را جدا کرد. نویسههای غیرحرفی نادیده گرفته میشوند و حروف بینالمللی خارج از بازهٔ A-Z مانند واکه در نظر گرفته میشوند.
SQL> SELECT SOUNDEX('Hello');
-- H400
expr1 SOUNDS LIKE expr2 معادل مقایسهٔ SOUNDEX(expr1) = SOUNDEX(expr2) است.
SPACE(N)
رشتهای شامل N نویسهٔ فاصله برمیگرداند.
SQL> SELECT SPACE(6);
-- ' '
STRCMP(str1,str2)
دو رشته را مقایسه میکند: اگر برابر باشند ۰، اگر آرگومان نخست طبق ترتیب مرتبسازی جاری کوچکتر باشد منفی ۱، و در غیر این صورت ۱ برمیگرداند.
SQL> SELECT STRCMP('MOHD', 'MOHD'); -- 0
SQL> SELECT STRCMP('AMOHD', 'MOHD'); -- -1
SQL> SELECT STRCMP('MOHD', 'AMOHD'); -- 1
SUBSTRING
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
شکلهای بدون len زیررشته را از موقعیت pos تا انتها و شکلهای دارای len به تعداد len نویسه برمیگردانند. نحوهای دارای FROM نحو استاندارد SQL هستند. pos میتواند منفی باشد؛ در این صورت موقعیت از انتهای رشته محاسبه میشود.
SQL> SELECT SUBSTRING('Quadratically',5);
-- ratically
SQL> SELECT SUBSTRING('foobarbar' FROM 4);
-- barbar
SQL> SELECT SUBSTRING('Quadratically',5,6);
-- ratica
SUBSTRING_INDEX(str,delim,count)
زیررشتهای را پیش از تعداد مشخصی رخداد جداکننده برمیگرداند. اگر count مثبت باشد، بخش سمت چپ جداکنندهٔ نهایی با شمارش از چپ و اگر منفی باشد، بخش سمت راست جداکنندهٔ نهایی با شمارش از راست برگردانده میشود. جستوجوی جداکننده نسبت به بزرگی و کوچکی حروف حساس است.
SQL> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-- www.mysql
TRIM
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str)
TRIM([remstr FROM] str)
پیشوند یا پسوند remstr را از رشته حذف میکند. اگر BOTH، LEADING یا TRAILING مشخص نشود، BOTH فرض میشود. remstr اختیاری است و در صورت حذف، فاصلهها پاک میشوند.
SQL> SELECT TRIM(' bar '); -- bar
SQL> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx'); -- barxxx
SQL> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx'); -- bar
SQL> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz'); -- barx
UCASE(str)، UNHEX(str) و UPPER(str)
UCASE() مترادف UPPER() است. UNHEX() عمل معکوس HEX(str) را انجام میدهد: هر جفت رقم هگزادسیمال را به عدد و سپس نویسهٔ متناظر تبدیل میکند و رشتهٔ دودویی برمیگرداند. اگر نویسهٔ غیرهگزادسیمال ببیند NULL میدهد. UPPER() نویسهها را بر اساس نگاشت مجموعهنویسه به حروف بزرگ تبدیل میکند.
SQL> SELECT UNHEX('4D7953514C');
-- MySQL
SQL> SELECT UPPER('Allah-hus-samad');
-- ALLAH-HUS-SAMAD