CONCAT التعرف على الحقول فارغة
-
10-07-2019 - |
سؤال
لدي جدول مع ثلاثة حقول الاسم الأول اسم العائلة و البريد الإلكتروني.
هنا بعض بيانات وهمية:
FirstName | LastName | Email
Adam West adam@west.com
Joe Schmoe NULL
الآن, إذا كنت تفعل:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
الحيوية بالنسبة جو باطل ، كما أن هناك واحد null المجال.كيف يمكنك التغلب على هذا السلوك ؟ أيضا, هل هذا هو السلوك الافتراضي في MS SQL Server?
المحلول
وحاول
ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL
وهكذا،
CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL
وسيعود الشيء نفسه دون قضية فارغة (وسلسلة فارغة حيث يجب أن يكون بلا قيم).
نصائح أخرى
وانظروا CONCAT_WS
وعلى سبيل المثال:
CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
والعائد
وTEST STRINGTEST STRING 2
وهذا هو أسهل من بناء IFNULL
حول كل شيء. يمكنك استخدام سلسلة فارغة كفاصل.
في الخلية ISNULL متعود العمل بعض الوقت. محاولة IFNULL ()،
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS
ينصح و، ولكن إذا كنت مدمن مخدرات حقا على CONCAT، ألفه في {FN} ويمكنك استخدام وظيفة ODBC مثل:
SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS
إذا كنت تحتاج أولا <مساحة> الأخيرة ولكن فقط عندما الأخير أولا فارغة يمكنك القيام بذلك:
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
وأضفت مساحة على الاسم الأول الذي قد يكون لاغيا - ذلك يعني أن مساحة البقاء على قيد الحياة إلا إذا كان الاسم الأول قيمة
لوضع كل منهم مع مسافة بين كل من:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
ويمكنك دائما استخدام الإعداد CONCAT_NULL_YIELDS_NULL
..
وفقط تشغيل SET CONCAT_NULL_YIELDS_NULL OFF
وبعد ذلك كل تسلسالت null
سيؤدي في النص وغير فارغة ..
والجواب ستيفان هو الصحيح. للتحقيق قليلا أعمق عليك أن تعرف أن NULL ليس هو نفسه كما لا شيء. يمثل باطل لعدم وجود قيمة، أو بعبارة أخرى، لم تعرف. لا شيء يمثل سلسلة فارغة الذي هو في الواقع قيمة.
وغير معرف + شيء = غير معروف
وجيد طعام شهي قاعدة بيانات لالتمسك!
إذا تحصل عليه (كما أفعل في الخلية):
#1582 - Incorrect parameter count in the call to native function 'ISNULL'
ويمكنك استبدال وظيفة ISNULL التي تلتحم:
CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
وانطلاقا من MS SQL خادم 2012 عرضه وظيفة CONCAT و وفقا لMSDN
<اقتباس فقرة> يتم تحويلوالقيم الخالية ضمنا إلى سلسلة فارغة. إذا كانت جميع حجج باطلة، يتم إرجاع سلسلة فارغة من نوع VARCHAR (1).
اقتباس فقرة>وذلك يكفي لاستخدام CONCAT دون ISNULL
CONCAT(FirstName, LastName, Email)
وليس لديها SQL خادم وظيفة CONCAT
.
(تحديث: ابتداء من MS SQL خادم 2012 عرضه CONCAT وظيفة )
في سلوك خادم SQL الافتراضي، بالقيم الفارغة تنتشر من خلال التعبير.
في SQL Server و واحد من شأنه إرسال:
SELECT FirstName + LastName + Email as Vitals FROM MEMBERS
إذا كنت تحتاج إلى معالجة NULL
s:
SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
في حالة MS الوصول
والخيار 1) SELECT (الاسم الأول + "" + اسم العائلة + "" + البريد الإلكتروني)، والأعضاء الحيوية من أعضاء سوف تحصل نتيجة فارغة في حال وجود أي مجال مع لاغية.
والخيار 2) SELECT (الاسم الأول & "" & اسم العائلة و"" والبريد الإلكتروني)، والأعضاء الحيوية من أعضاء سوف تحصل الفضاء في مكان الميدان مع اغية.
بعد مراقبة الإجابات عن هذا السؤال ، هل يجوز الجمع بين كل منهم في حل بسيط واحد
CONCAT_WS(',',
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName),
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname),
IF(NULLIF(Email, '') IS NULL, NULL, Email))
لذلك, باختصار نحن نستخدم CONCAT_WS
لسلسلة حقول منفصلة لهم ,
;و لاحظ أن NULL
الحقول ولا EMPTY
لن متسلسلة
NULLIF سوف تحقق إذا كان الحقل هو NULL
أو EMPTY
, ، وهو الحقل الذي يحتوي فقط على مسافات أو فارغة أيضا, مثلا:", ' ') والناتج سوف يكون إما NULL
أو NOT NULL
إذا سوف اخماد الحقل إذا لم يكن NULL
أو EMPTY