Используя TSQL, могу ли я увеличить столбец CHAR (1) на единицу и использовать его в LEFT OUTER JOIN без оператора CASE? - PullRequest
6 голосов
/ 02 июня 2009

Этот вопрос похож на мой последний вопрос . За исключением этого времени я использую буквы, а не 6-значные целые числа. Я хочу найти непоследовательные "буквы".

Допустим, у меня есть следующие данные:

id | Date | Letter
-----------------------------
01 | 5/1/2009 | X
02 | 5/1/2009 | Y
03 | 5/1/2009 | Z
04 | 5/1/2009 | A
05 | 5/1/2009 | B
06 | 5/1/2009 | D

Я бы хотел иметь возможность задать запрос, который сказал бы, что между строкой 05 и 06 должна быть строка с буквой "C".

В моем последнем вопросе (с использованием INT) мне предложили что-то похожее на следующее решение, и оно отлично работало.

SELECT * from TABLE1 t1 
LEFT OUTER JOIN TABLE2 t2 ON t2.INTCol - 1 = t2.INTCol AND t1.date = t2.date
WHERE t2.id IS NULL

Ну, с буквами (насколько я знаю) я не могу сказать (G - 1). Итак, есть ли другой способ сделать это?

База данных, которую я использую, - это SQL Server 2005. Я считаю, что в PL / SQL есть простое решение, использующее TRANSLATE, но я не думаю, что могу сделать что-либо подобное, используя TSQL.

Ответы [ 2 ]

11 голосов
/ 02 июня 2009

Вы можете преобразовать char (1) в его число ascii, используя

ASCII(Letter)

Затем вы можете увеличить это значение на единицу и вернуть его в букву, используя CHAR (при необходимости), поэтому ваш код будет таким:

SELECT * from TABLE1 t1 
LEFT OUTER JOIN TABLE2 t2 
      ON ASCII(t1.INTCol) - 1 = ASCII(t2.INTCol) 
      AND t1.date = t2.date
WHERE t2.id IS NULL
4 голосов
/ 02 июня 2009

Вы можете использовать функцию ASCII () для преобразования символа в его значение ASCII:

ASCII (Письмо)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...