cancel
Showing results for 
Search instead for 
Did you mean: 

Beware of ORDER BY syntax error in IF EXISTS SELECT TOP

Breck_Carter
Participant
2,405

Historically, there have been many [cough] arcane limitations on coding a SELECT as an expression; this may be another.

SELECT @@VERSION;
'16.0.0.2512'

-- IF EXISTS SELECT TOP ORDER BY expression fails
BEGIN
DECLARE @yn VARCHAR ( 1 );
SET @yn = IF EXISTS 
   ( SELECT TOP 1 START AT 100 * 
       FROM RowGenerator 
      WHERE row_num < 50 
      ORDER BY row_num ASC 
   ) THEN 'Y' ELSE 'N' END IF;
SELECT @yn;
END;

Could not execute statement.
Syntax error near 'ORDER' on line 7
SQLCODE=-131, ODBC 3 State="42000"
Line 1, column 1
(Continuing after error)

-- IF EXISTS SELECT TOP ORDER BY statement fails

BEGIN
DECLARE @yn VARCHAR ( 1 );
IF EXISTS 
   ( SELECT TOP 1 START AT 100 * 
       FROM RowGenerator 
      WHERE row_num < 50 
      ORDER BY row_num ASC 
   ) 
   THEN SET @yn = 'Y';
   ELSE SET @yn = 'N'; 
END IF;
SELECT @yn;
END;

Could not execute statement.
Syntax error near 'ORDER' on line 7
SQLCODE=-131, ODBC 3 State="42000"
Line 1, column 1
(Continuing after error)

-- SELECT TOP INTO ... IF IS NOT NULL works (example 1)
BEGIN
DECLARE @yn VARCHAR ( 1 );
DECLARE @dummy_result SMALLINT;
SET @dummy_result = NULL;
SELECT TOP 1 START AT 100 row_num
  INTO @dummy_result 
  FROM RowGenerator 
 WHERE row_num < 50 
 ORDER BY row_num ASC;
IF @dummy_result IS NOT NULL
   THEN SET @yn = 'Y';
   ELSE SET @yn = 'N'; 
END IF;
SELECT @yn;
END;

@yn
'N'

-- SELECT TOP INTO ... IF IS NOT NULL works (example 2)
BEGIN
DECLARE @yn VARCHAR ( 1 );
DECLARE @dummy_result SMALLINT;
SET @dummy_result = NULL;
SELECT TOP 1 START AT 100 row_num
  INTO @dummy_result 
  FROM RowGenerator 
 WHERE row_num < 200 
 ORDER BY row_num ASC;
IF @dummy_result IS NOT NULL
   THEN SET @yn = 'Y';
   ELSE SET @yn = 'N'; 
END IF;
SELECT @yn;
END;

@yn
'Y'

Accepted Solutions (1)

Accepted Solutions (1)

Former Member

Breck - as far as I can remember, EXISTS did have a restriction on not supporting ORDER BY. The game-changer was the support of SELECT TOP and I think what you're seeing is an unintended restriction. I'll have a look. There isn't really any reason why queries (1) and (2) shouldn't work.

VolkerBarth
Contributor
0 Kudos

Wow, a classic Glenn Answer, welcome back!

Breck_Carter
Participant

Yes, welcome back! ( I thought you were shackled to Hanna 🙂

VolkerBarth
Contributor
0 Kudos

Or IQ?

FWIW, there might be a choice to MERGE "gpaulley" and this legendary user🙂

Answers (0)