patternsqlCritical
Why can't I use a CASE statement to see if a column exists and not SELECT from it?
Viewed 0 times
casefromwhycanstatementcolumnseeexistsandselect
Problem
Why does something like this not work?
I am just checking if the column exists, however, SQL Server complains about
SELECT
CASE
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;I am just checking if the column exists, however, SQL Server complains about
Somecol not existing. Is there an alternative to this in a single statement?Solution
The following query uses the same idea as in this amazing answer by ypercube:
It works like this:
-
if
-
if the table has no such column, the reference will still be valid, because now it will be resolved as
You can specify multiple "spare" columns that way. The trick is not to use the table alias for such columns (which is a frowned-upon practice in most situations, but in this case omitting the table alias helps you to resolve the issue).
If the table is used in a join and the other table has its own
SELECT x.*
FROM (SELECT NULL AS SomeCol) AS dummy
CROSS APPLY
(
SELECT
ID,
SomeCol AS MyTest
FROM dbo.Customers
) AS x;It works like this:
-
if
dbo.Customers has a column named SomeCol, then SomeCol in SomeCol AS MyTest will resolve as dbo.Customers.SomeCol;-
if the table has no such column, the reference will still be valid, because now it will be resolved as
dummy.SomeCol: dummy columns can be referenced in that context.You can specify multiple "spare" columns that way. The trick is not to use the table alias for such columns (which is a frowned-upon practice in most situations, but in this case omitting the table alias helps you to resolve the issue).
If the table is used in a join and the other table has its own
SomeCol, you will probably need to use the above query as a derived table before using it in the join in order to keep the trick working, something like this:SELECT ...
FROM
(
SELECT x.*
FROM (SELECT NULL AS SomeCol) AS dummy
CROSS APPLY (
SELECT
ID,
SomeCol AS MyTest
FROM dbo.Customers
) AS x
) AS cust
INNER JOIN ...
;Code Snippets
SELECT x.*
FROM (SELECT NULL AS SomeCol) AS dummy
CROSS APPLY
(
SELECT
ID,
SomeCol AS MyTest
FROM dbo.Customers
) AS x;SELECT ...
FROM
(
SELECT x.*
FROM (SELECT NULL AS SomeCol) AS dummy
CROSS APPLY (
SELECT
ID,
SomeCol AS MyTest
FROM dbo.Customers
) AS x
) AS cust
INNER JOIN ...
;Context
StackExchange Database Administrators Q#66741, answer score: 50
Revisions (0)
No revisions yet.