SQL - جملة WHERE على كل أمر SET في UPDATE؟
-
07-07-2019 - |
سؤال
وأنا أحاول أن إنشاء استعلام SQL في PHP لتحديث الجدول.
هل من الممكن أن يكون بندا WHERE
مختلفة لكل صف المتضررين؟
وعلى سبيل المثال شيئا مثل:
UPDATE table
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2
وغيرها؟
وأي عن تقديره للمساعدة. بفضل
المحلول
وأنت لا يمكن أن يكون العديد من عبارات WHERE لأي بيان SQL، ولكن يمكنك استخدام بيان حالة لإنجاز ما تحاول القيام به. وثمة خيار آخر أن لديك هو تنفيذ عبارات UPDATE متعددة.
وهنا هو عينة باستخدام عبارة حالة:
UPDATE table
SET val = (
CASE someproperty
WHEN 1 THEN X
WHEN 2 THEN Y
ELSE val
END
);
وهنا هو عينة باستخدام عبارات UPDATE متعددة:
UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;
نصائح أخرى
نعم، يمكنك مع بيان حالة.
UPDATE table
SET val = CASE someproperty
WHEN 1 THEN x
WHEN 2 THEN y
....
ELSE
val
END
والآن، هناك قلق من أن بيان CASE
واحد هو أقل قراءة بالمقارنة مع العديد من البيانات UPDATE
. هناك حجة صحيحة هنا. على سبيل المثال، عندما يتم تحديث 1000 الصفوف، هو فقط يشعر ويبدو من الأفضل استخدام البيانات UPDATE
عدة بدلا من 1000 ظروف مختلفة إلى CASE
واحد.
ولكن، في بعض الأحيان بيان حالة هو أكثر ملاءمة. إذا، على سبيل المثال، تقوم بتحديث صفوف استنادا إلى بعض الصفات، ويقول الطبيعة الفردية أو الزوجية من قيمة الحقل في الجدول، ثم بيان CASE
هو وسيلة موجزة رائعة وللصيانة لتحديث الصفوف في الجدول دون الحاجة إلى اللجوء إلى عدد هائل من البيانات UPDATE
أن كل حصة نوع معين من المنطق. خذ هذا على سبيل المثال:
UPDATE table
SET val = CASE MOD(someproperty, 2)
WHEN 0 THEN x
WHEN 1 THEN y
END
وهذا التعبير يأخذ معامل someproperty، وعند 0 (حتى)، يعين قيمة س لفال، وعندما 1 (الغريب)، يعين قيمة ص لفال. وكلما زاد حجم البيانات التي يتم تحديثها من هذا البيان، ونظافة ومقارنته بذلك تصريحات UPDATE
متعددة.
وباختصار، البيانات CASE
في بعض الأحيان مثلما قراءة / للصيانة كما البيانات UPDATE
. كل هذا يتوقف على ما كنت تحاول أن تفعل معهم.
تعديل : في إضافة شرط آخر لتكون آمنة اضافية. قد يكون OP الذين يرغبون في تحديث صفوف معينة فقط حتى بقية يجب أن تبقى لأنها قبل UPDATE.
تعديل : لوأضاف سيناريو حيث بيان CASE
هو نهج أكثر فعالية من البيانات UPDATE
متعددة.
وكلا. جعله اثنين من التحديثات:
UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;
في الفكرة الثانية، هل يمكن استخدام الاستعلامات الفرعية أو بيان حالة ...
UPDATE table SET val= ( case when someproperty = 1 then X when someproperty = 2 then Y else val END )
وقد تحتاج لجعل هذا استعلام فرعي مثل هذا:
UPDATE table t1 SET val = ( select CASE when someproperty = 1 then X when someproperty = 2 then Y ELSE val END from table t2 where t1.primarykey = t2.primary key )
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END
وهناك طريقة مدمجة وقابلة بسهولة:
UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '1, 2'), X, Y);
وجعل الاستعلام بهذه الطريقة:
$condition = array(1, 2);
$newvals = array('X', 'Y');
$query = "UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '". implode(',', $condition). "', ". implode(', ', $newvals). ")";
استخدم prepare_query لتجنب أخطاء في بناء الجملة SQL إذا كنت تتعامل مع قيم السلسلة.