ใน MySQL ฉันสามารถเลือกคอลัมน์ที่มีบางสิ่งได้หรือไม่
ตัวอย่างเช่นฉันมีคำถามต่อไปนี้:
select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2
ฉันกำลังพยายามเลือกเฉพาะแถวที่โทรศัพท์ขึ้นต้นด้วย 813 และ phone2 มีบางอย่างในนั้น
ใน MySQL ฉันสามารถเลือกคอลัมน์ที่มีบางสิ่งได้หรือไม่
ตัวอย่างเช่นฉันมีคำถามต่อไปนี้:
select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2
ฉันกำลังพยายามเลือกเฉพาะแถวที่โทรศัพท์ขึ้นต้นด้วย 813 และ phone2 มีบางอย่างในนั้น
คำตอบ:
เปรียบเทียบค่าของphone2กับสตริงว่าง:
select phone, phone2
from jewishyellow.users
where phone like '813%' and phone2<>''
โปรดทราบว่าค่าถูกตีความว่าเป็นNULLfalse
phone2<>""จะไม่ผ่านตัวตรวจสอบไวยากรณ์ SQL ใด ๆ
เพื่อตรวจสอบว่าข้อมูลคือการใช้โมฆะIS NULL, IS NOT NULLผู้ประกอบการ
การอ้างอิง MySql http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
ตรวจสอบNULLและล้างค่าสตริง:
select phone
, phone2
from users
where phone like '813%'
and trim(coalesce(phone2, '')) <>''
NB ฉันคิดว่า COALESCE () เป็นมาตรฐาน SQL (-ish) ในขณะที่ ISNULL () ไม่ใช่
คำตอบที่ฉันใช้อยู่ซึ่งใช้งานได้ดีสำหรับฉันค่อนข้างดีที่ฉันไม่ได้เห็นที่นี่ (คำถามนี้เก่ามากดังนั้นจึงอาจไม่ได้ผล)
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 > ''
สังเกตุชิ้น> ''ส่วนซึ่งจะตรวจสอบว่าค่าไม่เป็นโมฆะและถ้าค่านั้นไม่ใช่แค่ช่องว่างหรือว่างเปล่า
โดยทั่วไปถ้าสนามมีบางอย่างในนั้นนอกเหนือจากช่องว่างหรือNULLมันเป็นเรื่องจริง มันสั้นมากดังนั้นจึงง่ายในการเขียนและอีกอย่างบวกกับCOALESCE()และIFNULL()ฟังก์ชั่นก็คือมันเป็นดัชนีที่เป็นมิตรเนื่องจากคุณไม่ได้เปรียบเทียบผลลัพธ์ของฟังก์ชันบนสนามกับทุกสิ่ง
กรณีทดสอบ:
SELECT if(NULL > '','true','false');-- false
SELECT if('' > '','true','false');-- false
SELECT if(' ' > '','true','false');-- false
SELECT if('\n' > '','true','false');-- false
SELECT if('\t' > '','true','false');-- false
SELECT if('Yeet' > '','true','false');-- true
UPDATEมีข้อแม้นี้ว่าผมไม่ได้คาดหวัง แต่ค่าตัวเลขที่มีศูนย์หรือด้านล่างนี้คือไม่มากกว่าสตริงว่างเปล่าดังนั้นถ้าคุณกำลังจัดการกับตัวเลขที่สามารถลบหรือเป็นศูนย์แล้วไม่ทำเช่นนี้ , มันกัดฉันเร็ว ๆ นี้และเป็นเรื่องยากมากที่จะแก้ปัญหา :(
หากคุณกำลังใช้สตริง (อักขระ, อักขระ, ข้อความ ฯลฯ ) สิ่งนี้จะสมบูรณ์แบบได้อย่างดีเพียงระวังตัวเลข
หากมีช่องว่างในฟิลด์ phone2 จากการป้อนข้อมูลโดยไม่ตั้งใจคุณสามารถละเว้นระเบียนเหล่านั้นด้วยฟังก์ชัน IFNULL และ TRIM:
SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
AND TRIM(IFNULL(phone2,'')) <> '';
select phone, phone2 from jewishyellow.users
where phone like '813%' and phone2 is not null
NULLค่าและสตริงว่าง''ซึ่งเป็นค่า หากคุณต้องการตรวจสอบกับสตริงว่างใช้column <> ''ตามคำแนะนำอื่น ๆ
SELECT phone, phone2
FROM jewishyellow.users
WHERE phone like '813%' and (phone2 <> "");
อาจต้องปรับแต่งขึ้นอยู่กับค่าเริ่มต้นของคุณ หากคุณอนุญาตให้เติม Null คุณสามารถทำ "Not NULL" แทนซึ่งดีกว่าอย่างชัดเจน
NOT()ฟังก์ชั่นใน MySQL 2) phone2=""จะไม่ผ่านการตรวจสอบไวยากรณ์ SQL ใด ๆ
เราสามารถใช้ CASE เพื่อตั้งค่าว่างเป็นถ่านหรือสตริง ฉันใช้ NA เป็นสตริงเริ่มต้น
SELECT phone,
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0)
FROM jewishyellow.users WHERE phone LIKE '813%'
อีกทางเลือกหนึ่งคือการดูเฉพาะที่ CHAR_LENGTHค่าคอลัมน์ (เพื่อไม่ให้สับสนกับLENGTH)
โดยใช้เกณฑ์ที่มีความยาวตัวอักษรมากกว่า 0 จะหลีกเลี่ยงการบวกเท็จเมื่อค่าของคอลัมน์สามารถ falsey เช่นในกรณีของคอลัมน์จำนวนเต็มมีค่าของหรือ0 NULLทำหน้าที่อย่างสม่ำเสมอมากขึ้นในประเภทข้อมูลที่แตกต่างกัน
ซึ่งส่งผลให้ค่าใด ๆ ที่มีความยาวอย่างน้อย 1 ตัวอักษรหรืออย่างอื่นไม่ว่างเปล่า
SELECT phone, phone2
FROM users
WHERE phone LIKE '813%'
AND CHAR_LENGTH(phone2) > 0
ข้อมูลตาราง
users
phone (varchar 12) | phone2 (int 10)
"813-123-4567" | NULL
"813-123-4567" | 1
"813-123-4567" | 0
users2
phone (varchar 12) | phone2 (varchar 12)
"813-123-4567" | NULL
"813-123-4567" | "1"
"813-123-4567" | "0"
"813-123-4567" | ""
CHAR_LENGTH(phone2) > 0ผลลัพธ์ (เหมือนกัน)
users
813-123-4567 | 1
813-123-4567 | 0
users2
813-123-4567 | 1
813-123-4567 | 0
ทางเลือก
phone2 <> ''ผลลัพธ์ (ต่างกัน)
users
813-123-4567 | 1
users2
813-123-4567 | 1
813-123-4567 | 0
phone2 > ''ผลลัพธ์ (ต่างกัน)
users
813-123-4567 | 1
users2
813-123-4567 | 1
813-123-4567 | 0
COALESCE(phone2, '') <> ''ผลลัพธ์ (เดียวกัน)
หมายเหตุ: ผลลัพธ์phone2 IS NOT NULL AND phone2 <> ''ไม่ตรงกับที่คาดไว้
users
813-123-4567 | 1
813-123-4567 | 0
users2
813-123-4567 | 1
813-123-4567 | 0
phone2 IS NOT NULL AND phone2 <> ''ผลลัพธ์ (ต่างกัน)
users
813-123-4567 | 1
users2
813-123-4567 | 1
813-123-4567 | 0
น่าแปลกที่ (อย่างที่ไม่มีใครพูดถึงมาก่อน) พบว่าเงื่อนไขด้านล่างทำงานได้:
WHERE ORD(field_to_check) > 0
เมื่อเราต้องการยกเว้นค่า Null และค่าว่าง มีใครตระหนักถึงข้อเสียของวิธีการหรือไม่
ใช้:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 IS NOT NULL
IS NOT NULLไม่ได้ใช้กับคอลัมน์สตริงเท่านั้นที่มีค่าว่าง ( '') ฉันไม่รู้ว่าทำไม แต่อยากจะชี้ให้เห็น มันฉลาดที่จะใช้t.phone2 <> ''เมื่อตรวจสอบคอลัมน์สตริงว่าง
คุณสามารถใช้ตัวดำเนินการแทนสัญลักษณ์แทนเพื่อให้ได้สิ่งนี้:
SELECT t.phone,
t.phone2
FROM jewishyellow.users t
WHERE t.phone LIKE '813%'
AND t.phone2 like '[0-9]';
ด้วยวิธีนี้คุณจะได้รับ phone2 ทั้งหมดที่มีหมายเลขนำหน้า
ในกรณีของฉันฉันมีคอลัมน์ varchar ทั้งวิธีการIS NOT NULL& != '' ไม่ทำงานแต่สิ่งต่อไปนี้ใช้ได้สำหรับฉัน เพิ่งวางนี่ออกมา
SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
phone2มีบางอย่างในมันได้หรือไม่" ผู้คนต่างคาดเดากันว่าคุณหมายถึงphone2IS NOT NULL, ไม่ว่างเปล่า, ไม่ใช่ช่องว่างพิเศษ ฯลฯ