මුල් ප්රශ්නය වූයේ "විමසුමක් පරාමිතිකරණය කරන්නේ කෙසේද ..."
මෙය මුල් ප්රශ්නයට පිළිතුරක් නොවන බව මෙහි සඳහන් කිරීමට මට ඉඩ දෙන්න . වෙනත් හොඳ පිළිතුරු වල දැනටමත් ඒ පිළිබඳ නිරූපණ කිහිපයක් තිබේ.
ඒ සමඟම, ඉදිරියට ගොස් මෙම පිළිතුර සලකුණු කරන්න, එය පහත් කරන්න, එය පිළිතුරක් නොවන ලෙස සලකුණු කරන්න ... ඔබ හරි යැයි විශ්වාස කරන ඕනෑම දෙයක් කරන්න.
මා (සහ තවත් 231) ඉහළට ඔසවා තැබීමට කැමති පිළිතුර සඳහා මාර්ක් බ්රැකට්ගේ පිළිතුර බලන්න. ඔහුගේ පිළිතුරෙහි දක්වා ඇති ප්රවේශය 1) බන්ධන විචල්යයන් effective ලදායී ලෙස භාවිතා කිරීමට සහ 2) උපහාසාත්මක අනාවැකි සඳහා ඉඩ ලබා දේ.
තෝරාගත් පිළිතුර
මට මෙහි ආමන්ත්රණය කිරීමට අවශ්ය වන්නේ ජොයෙල් ස්පොල්ස්කිගේ පිළිතුරෙහි දක්වා ඇති ප්රවේශයයි, නිවැරදි පිළිතුර ලෙස “තෝරාගත්” පිළිතුරයි.
ජොයෙල් ස්පොල්ස්කිගේ ප්රවේශය දක්ෂයි. එය සාධාරණ ලෙස ක්රියාත්මක වන අතර, එය “සාමාන්ය” අගයන් ලබා දී ඇති අතර, NULL සහ හිස් නූල වැනි ප්රමිතිගත දාර සමඟ. විශේෂිත යෙදුමක් සඳහා එය ප්රමාණවත් විය හැකිය.
නමුත් මෙම ප්රවේශය සාමාන්යකරණය කිරීමේදී, Name
තීරුවේ ආදේශක අක්ෂරයක් අඩංගු වන විට (LIKE අනාවැකි මගින් හඳුනාගෙන ඇති පරිදි) වඩාත් අපැහැදිලි කොන අවස්ථා ද සලකා බලමු . මම බහුලව භාවිතා කරන වයිල්ඩ්කාඩ් චරිතය %
(ප්රතිශත ලකුණකි.). ඒ නිසා අපි දැන් මෙහි ගනුදෙනු කරමු, පසුව වෙනත් අවස්ථාවන්ට යමු.
% අක්ෂර සමඟ සමහර ගැටලු
හි නම අගය සලකා බලන්න 'pe%ter'
. (මෙහි ඇති උදාහරණ සඳහා, මම තීරු නම වෙනුවට වචනාර්ථයෙන් නූල් අගයක් භාවිතා කරමි.) පෝරමයේ විමසුමකින් `'pe% ter' හි නම අගයක් සහිත පේළියක් ආපසු ලබා දෙනු ඇත:
select ...
where '|peanut|butter|' like '%|' + 'pe%ter' + '|%'
සෙවුම් පදවල අනුපිළිවෙල ආපසු හරවනු ලැබුවහොත් එම පේළියම ආපසු නොලැබේ :
select ...
where '|butter|peanut|' like '%|' + 'pe%ter' + '|%'
අප නිරීක්ෂණය කරන හැසිරීම අමුතුයි. ලැයිස්තුවේ ඇති සෙවුම් පදවල අනුපිළිවෙල වෙනස් කිරීම ප්රති result ල කට්ටලය වෙනස් කරයි.
pe%ter
ඔහු කොතරම් කැමති වුවත් රටකජු බටර් ගැලපීමට අපට අවශ්ය නොවනු ඇතැයි නොකියයි.
අපැහැදිලි කොන නඩුව
. මගේ අත්දැකීම් අනුව, LIKE
සංසන්දනාත්මක ක්රියාකරුවෙකුගේ දකුණු පැත්තේ ආදේශක කාඩ්පත් ලෙස සලකනු ලබන අක්ෂර හෝ රටා විශේෂයෙන් තහනම් කර ඇති දත්ත සමුදා බාධකයක් මම කලාතුරකින් දැක ඇත්තෙමි .
සිදුරක් ඇල්ලීම
මෙම සිදුර ඇලවීම සඳහා එක් ප්රවේශයක් වන්නේ %
ආදේශක චරිතයෙන් ගැලවීමයි. (ක්රියාකරුගේ පැන යාමේ වගන්තිය ගැන නොදන්නා ඕනෑම කෙනෙකුට, මෙන්න SQL සේවාදායක ප්රලේඛනයට සබැඳියක් .
select ...
where '|peanut|butter|'
like '%|' + 'pe\%ter' + '|%' escape '\'
දැන් අපට වචනයේ පරිසමාප්ත අර්ථයෙන්ම ගැලපේ. ඇත්ත වශයෙන්ම, අපට තීරු නමක් ඇති විට, අපට ආදේශක කාඩ්පතෙන් ගතිකව ගැලවීමට අවශ්ය වනු ඇත. අපට REPLACE
ශ්රිතය භාවිතා කර %
චරිතයේ සිදුවීම් සොයා ගැනීමටත් , එක් එක් කෙනා ඉදිරිපිට බැක්ස්ලෑෂ් අක්ෂරයක් ඇතුළත් කිරීමටත් හැකිය:
select ...
where '|pe%ter|'
like '%|' + REPLACE( 'pe%ter' ,'%','\%') + '|%' escape '\'
එබැවින්% ආදේශක කාඩ්පත සමඟ ගැටළුව විසඳයි. පාහේ.
පැන යාමෙන් බේරෙන්න
අපගේ විසඳුම තවත් ගැටලුවක් හඳුන්වා දී ඇති බව අපි හඳුනා ගනිමු. ගැලවීමේ චරිතය. ගැලවීමේ චරිතයේ ඕනෑම සිදුවීමකින් මිදීමට අපට අවශ්ය වනු ඇති බව අපට පෙනේ. මෙවර අපි භාවිතා කරන්නේ! ගැලවීමේ චරිතය ලෙස:
select ...
where '|pe%t!r|'
like '%|' + REPLACE(REPLACE( 'pe%t!r' ,'!','!!'),'%','!%') + '|%' escape '!'
අවධාරනය ද වේ
දැන් අපි රෝල් කර ඇති නිසා, අපට REPLACE
අවධාරනය කළ හැකි ආදේශක කාඩ්පත තවත් හසුරුව එකතු කළ හැකිය . විනෝදය සඳහා, මේ වතාවේ, අපි ගැලවීමේ චරිතය ලෙස භාවිතා කරමු.
select ...
where '|p_%t!r|'
like '%|' + REPLACE(REPLACE(REPLACE( 'p_%t!r' ,'$','$$'),'%','$%'),'_','$_') + '|%' escape '$'
පැන යාමට මම මෙම ප්රවේශයට වැඩි කැමැත්තක් දක්වන්නේ එය ඔරකල් සහ MySQL මෙන්ම SQL සේවාදායකයේ ක්රියාත්මක වන බැවිනි. (මම සාමාන්යයෙන් \ බැක්ස්ලෑෂ් ගැලවීමේ චරිතය ලෙස භාවිතා කරමි, මන්ද එය අප නිරන්තර ප්රකාශනවල භාවිතා කරන චරිතයයි. නමුත් සම්මුතියෙන් එය සීමා කරන්නේ ඇයි!
ඒ කරදරකාරී වරහන්
වයිල්ඩ්කාඩ් අක්ෂර වරහන් තුළට කොටු කිරීමෙන් වචනාර්ථයන් ලෙස සැලකීමට SQL සේවාදායකය ඉඩ දෙයි []
. එබැවින් අවම වශයෙන් SQL සේවාදායකය සඳහා අපි තවමත් නිවැරදි කර නැත. වරහන් යුගලවලට විශේෂ අරුතක් ඇති හෙයින්, අපට ඒවායින් ද ගැලවිය යුතුය. අපි වරහන් නිසි ලෙස ගැලවීමට සමත් වුවහොත්, අවම වශයෙන් අපට වරහන් තුළ ඇති යටි ඉර -
සහ කැරට් ගැන කරදර විය යුතු නැත ^
. වරහන් වල ඇති විශේෂ අරුත අප මූලික වශයෙන් අක්රීය කර ඇති බැවින් අපට වරහන් තුළ ඇති ඕනෑම අක්ෂර %
සහ _
අක්ෂර ගැලවී යා හැකිය .
ගැලපෙන වරහන් යුගල සොයා ගැනීම එතරම් අපහසු නොවිය යුතුය. සිංගල්ටන්% සහ _ සිදුවීම් හැසිරවීමට වඩා එය ටිකක් අපහසුයි. . .)
පේළිගත ප්රකාශනය අවුල් සහගත වේ
SQL හි එම පේළිගත ප්රකාශනය දිගින් දිගට හා කැත වෙමින් පවතී. අපට එය ක්රියාත්මක කිරීමට බොහෝ විට හැකිය, නමුත් ස්වර්ගය පිටුපසින් පැමිණෙන දුප්පත් ආත්මයට උදව් කර එය තේරුම් ගත යුතුය. පේළිගත ප්රකාශන සඳහා මම බොහෝ රසිකයන් වන බැවින්, මම මෙහි එකක් භාවිතා නොකිරීමට කැමැත්තෙමි, ප්රධාන වශයෙන් මට අවුලට හේතුව පැහැදිලි කරමින් අදහස් දැක්වීමක් කිරීමට අවශ්ය නැති නිසා සහ ඒ සඳහා සමාව ඉල්ලමි.
ශ්රිතයක් කොහේද?
හරි, ඉතින්, අපි එය SQL හි පේළිගත ප්රකාශනයක් ලෙස හසුරුවන්නේ නැත්නම්, අපට ඇති ආසන්නතම විකල්පය පරිශීලක අර්ථ දක්වන ලද ශ්රිතයකි. ඒ වගේම කිසිම දෙයක් වේගවත් නොවන බව අපි දනිමු (අපට ඔරකල් සමඟ කළ හැකි පරිදි දර්ශකයක් නිර්වචනය කළ නොහැකි නම්.) අපට ශ්රිතයක් නිර්මාණය කිරීමට සිදුවුවහොත්, SQL ලෙස හඳුන්වන කේතයෙන් අපට එය කළ හැකිය. ප්රකාශය.
එම ශ්රිතයට DBMS සහ අනුවාදය මත රඳා පවතින හැසිරීම් වල යම් වෙනස්කම් තිබිය හැකිය. (ඕනෑම දත්ත සමුදා එන්ජිමක් එකිනෙකට වෙනස් ලෙස භාවිතා කිරීමට හැකිවීම ගැන ඔබ උනන්දුවක් දක්වන ජාවා සංවර්ධකයින්ට හ shout නඟන්න.)
වසම් දැනුම
තීරුව සඳහා වසම පිළිබඳ අපට විශේෂ knowledge දැනුමක් තිබිය හැකිය, (එනම්, තීරුව සඳහා බලාත්මක කළ හැකි අගයන් සමූහය. තීරුවේ ගබඩා කර ඇති අගයන් කිසි විටෙකත් ප්රතිශත ලකුණක්, අවධාරනය කිරීමක් හෝ වරහනක් අඩංගු නොවන බව අපි දනිමු . යුගල. එම අවස්ථාවේ දී, එම සිද්ධීන් ආවරණය වන බවට ඉක්මන් අදහස් දැක්වීමක් අපි ඇතුළත් කරමු.
තීරුවේ ගබඩා කර ඇති අගයන්% හෝ _ අක්ෂර සඳහා ඉඩ දිය හැකිය, නමුත් අවහිරතාවයකට එම අගයන් ගැලවීමට අවශ්ය විය හැකිය, සමහර විට අර්ථ දක්වන ලද අක්ෂරයක් භාවිතා කරමින්, අගයන් සංසන්දනය “ආරක්ෂිත” වැනි ය. නැවතත්, අවසර ලත් වටිනාකම් සමූහය පිළිබඳ ඉක්මන් අදහස් දැක්වීමක් සහ විශේෂයෙන් ගැලවීමේ චරිතයක් ලෙස කුමන චරිතය භාවිතා කරනවාද යන්න සහ ජොයෙල් ස්පොල්ස්කිගේ ප්රවේශය සමඟ යන්න.
එහෙත්, විශේෂිත දැනුම හා සහතිකයක් නොමැති නම්, අවම වශයෙන් එම අපැහැදිලි මුල්ලක සිදුවීම් හැසිරවීම ගැන සලකා බැලීම වැදගත් වන අතර, හැසිරීම සාධාරණද යන්න සහ “පිරිවිතරයන්ට අනුව” යන්න සලකා බැලීම වැදගත් වේ.
වෙනත් ගැටළු නැවත සකස් කර ඇත
පොදුවේ සලකා බැලිය යුතු වෙනත් කරුණු සමහරක් අනෙක් අය දැනටමත් ප්රමාණවත් ලෙස පෙන්වා දී ඇතැයි මම විශ්වාස කරමි.
SQL එන්නත් කිරීම (පරිශීලක විසින් සපයන ලද තොරතුරු ලෙස පෙනෙන දේ ගැනීම සහ ඒවා බන්ධන විචල්යයන් හරහා සැපයීමට වඩා SQL පා text යේ ඇතුළත් කිරීම. බන්ධන විචල්යයන් භාවිතා කිරීම අවශ්ය නොවේ, එය SQL එන්නත් කිරීම වළක්වාලීමට එක් පහසු ප්රවේශයක් පමණි. එය සමඟ ගනුදෙනු කළ හැකි ක්රම:
දර්ශක සෙවීමට වඩා දර්ශක පරිලෝකනය භාවිතා කරන ප්රශස්තිකරණ සැලැස්ම, ආදේශක කාඩ්පත් වලින් ගැලවීම සඳහා ප්රකාශනයක් හෝ ශ්රිතයක් අවශ්ය විය හැකිය (ප්රකාශනය හෝ ක්රියාකාරිත්වය පිළිබඳ දර්ශකය)
බන්ධන විචල්යයන් වෙනුවට වචනාර්ථමය අගයන් භාවිතා කිරීම පරිමාණයට බලපෑම් කරයි
නිගමනය
මම ජොයෙල් ස්පොල්ස්කිගේ ප්රවේශයට කැමතියි. එය දක්ෂයි. එය ක්රියා කරයි.
නමුත් මම එය දුටු විගසම එය සමඟ ඇතිවිය හැකි ගැටළුවක් දුටුවෙමි. එය ලිස්සා යාමට ඉඩ දීම මගේ ස්වභාවය නොවේ. මම අන් අයගේ උත්සාහය විවේචනය කිරීමට අදහස් නොකරමි. බොහෝ සංවර්ධකයින් ඔවුන්ගේ කාර්යයන් පෞද්ගලිකව ගන්නා බව මම දනිමි, මන්ද ඔවුන් ඒ සඳහා විශාල මුදලක් ආයෝජනය කරන අතර ඔවුන් ඒ ගැන එතරම් සැලකිල්ලක් දක්වයි. එබැවින් කරුණාකර තේරුම් ගන්න, මෙය පුද්ගලික ප්රහාරයක් නොවේ. මා මෙහිදී හඳුනාගෙන ඇත්තේ පරීක්ෂණයට වඩා නිෂ්පාදනයේ වර්ධනය වන ගැටලුවයි.
ඔව්, මම මුල් ප්රශ්නයට වඩා බොහෝ දුර ගොස් ඇත. නමුත් ප්රශ්නයක් සඳහා “තෝරාගත්” පිළිතුර සමඟ වැදගත් කාරණයක් ලෙස මා සලකන දේ සම්බන්ධයෙන් මෙම සටහන තැබිය යුත්තේ කොතැනින්ද?