ทำไม 0 เท่ากับสตริงที่ว่างเปล่า?


23

ฉันต้องการความช่วยเหลือในการค้นหาสาเหตุที่T-SQLคำสั่งต่อไปนี้ส่งคืน1(จริง):

SELECT IIF( 0 = '', 1, 0)

ฉันเดาว่ามีคนเปลี่ยนตัวANSIเลือกที่ชอบSET ANSI_NULLSหรืออย่างอื่นที่ทำให้เกิดพฤติกรรม

ปัญหาของฉันคือฉันเข้าร่วมค่าบางอย่างและในชุดแถวสุดท้ายฉันมีค่าที่เข้าร่วม0และ''ค่าซึ่งไม่ถูกต้อง

คำตอบ:


31

นั่นเป็นเพียงพฤติกรรมที่บันทึกไว้ ฉันไม่คิดว่าจะมีใครมายุ่งกับการตั้งค่า

ดูลำดับความสำคัญของประเภทข้อมูลใน MSDN

เมื่อโอเปอเรเตอร์รวมสองนิพจน์ของชนิดข้อมูลที่แตกต่างกันกฎสำหรับลำดับความสำคัญของชนิดข้อมูลระบุว่าชนิดข้อมูลที่มีลำดับความสำคัญต่ำกว่าจะถูกแปลงเป็นชนิดข้อมูลที่มีลำดับความสำคัญสูงกว่า

ตามที่ระบุไว้ในความคิดเห็นสตริงว่างจะถูกแปลงเป็น 0 ในประเภทตัวเลขใด ๆ และเป็น 1900-01-01 00: 00: 00.000 เมื่อแปลงเป็นวันที่

แก้ไข: ฉันคิดว่าปัญหาที่แท้จริงของคุณคือการออกแบบของคุณเพื่อให้คุณต้องเข้าร่วมในสาขาของประเภทข้อมูลที่แตกต่างกัน วิธีเดียวที่จะหลีกเลี่ยงปัญหานี้ได้คือการแปลงข้อเข้าร่วมของคุณซึ่งจะส่งผลเสียต่อประสิทธิภาพการค้นหา ปัญหาหลักอาจเกิดจากการออกแบบสคีมา

แก้ไข: มีการอภิปรายจำนวนมากในความคิดเห็นที่ถูกย้ายไปแชท อย่างไรก็ตามมันอาจดูไร้เหตุผลการแปลงสตริงว่างให้เป็นชนิดข้อมูลอื่นจะสร้างค่าตามอำเภอใจ

รหัสนี้:

SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')

สร้างเอาต์พุตนี้:

0
0
1900-01-01
1900-01-01 00:00:00.000

คุณสามารถคาดหวังได้ว่าพฤติกรรมนี้มีความสอดคล้องกันระหว่างประเภทข้อมูลก่อนหน้านี้อื่น ๆ และคาดว่าการแปลง 0 เป็นวันที่จะให้ค่าตามอำเภอใจเท่าเดิม แต่ไม่เกิดขึ้น

SELECT CONVERT(date, 0)

ผลิต

ไม่อนุญาตการแปลงที่ชัดเจนจากประเภทข้อมูลถึงวันที่

เพราะมันไม่ใช่การแปลงที่รองรับ

ในขณะที่

SELECT CONVERT(datetime, 0)

ผลตอบแทน

มกราคม 01 1900 00:00:00

ใช่แล้วมันแปลกและเป็นอิสระ แต่มีการบันทึกและอธิบายได้จริง


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม สนทนาเกี่ยวกับคำตอบนี้ได้รับการย้ายไปแชท
พอลไวท์พูดว่า GoFundMonica

2
พฤติกรรมCAST('' AS INT)-> 0 มีการบันทึกไว้ที่อื่นหรือไม่ มันจะดีถ้าคุณเพิ่มการอ้างอิง
Salman A

2
@SalmanA: ควรมีการบันทึกไว้ในส่วน "การแปลงข้อมูลตัวละคร" ของเอกสารchar / varcharแต่ในปัจจุบันยังไม่มี ฉันได้ออกความคิดเห็นข้อเสนอแนะเพื่อขอให้มันรวม
Heinzi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.