سؤال

لدي جدول مع ثلاثة حقول الاسم الأول اسم العائلة و البريد الإلكتروني.

هنا بعض بيانات وهمية:

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

إذا كنت تحتاج إلى معالجة NULLs:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top