sql >> Databáze >  >> RDS >> Sqlserver

Proč T-SQL ISNULL() zkracuje řetězec a COALESCE ne?

Podle dokumentace společnosti Microsoft , pro funkci:

ISNULL(check_expression, replacement_value)

replacement_value musí být typu, který je implicitně převoditelný na typ check_expression . Všimněte si, že zadejte 'xy'+NULL je VARCHAR(3) . Z tohoto důvodu váš řetězec 'ABCDEFGHIJ' je přetypován na VARCHAR(3) a takto oříznuté.

Zní to divně, proč to není VARCHAR(2) , ale je to tak - o jeden znak delší než 'xy' . Můžete hrát s tímto SQLFiddle a přesvědčte se sami o typu 'xy'+NULL je stejný jako u výrazu CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , což je NULL ale je implicitně kompatibilní s VARCHAR(3) .

Zdá se, že pro výraz 'xy'+NULL vnímanou délku lze vypočítat jako 'xy' délka řetězce (2) plus 1 za každý NULL přidal. Zadejte například 'xy'+NULL+NULL je VARCHAR(4) , zadejte 'xy'+NULL+NULL+NULL je VARCHAR(5) a tak dále – podívejte se na tento SQLFiddle . To je extrémně divné, ale takhle fungují MS SQL Server 2008 a 2012.



  1. Můžeme omezit počet řádků v tabulce v MySQL?

  2. Jak funguje funkce Ln() v PostgreSQL

  3. Kdo by měl převzít iniciativní úlohu při vrácení zpět, aplikace nebo databáze?

  4. Problém návrhu tabulky databáze