Почему предложение EXCEPT обрезает пробелы в конце текста? - PullRequest
0 голосов
/ 25 октября 2019

Я прочитал документацию для оператора SqlServer EXCEPT, и я не вижу упоминания о явной обрезке пробела в конце строки. Однако при запуске:

SELECT 'Test'
EXCEPT
SELECT 'Test '

результаты не возвращаются. Может кто-нибудь объяснить это поведение или как избежать этого при использовании EXCEPT?

1 Ответ

2 голосов
/ 25 октября 2019

ANSI SQL-92 требует, чтобы строки были одинаковой длины перед сравнением, а символ заполнения - это пробел.

См. https://support.microsoft.com/en-us/help/316626/inf-how-sql-server-compares-strings-with-trailing-spaces для получения дополнительной информации

В стандарте ANSI(доступ здесь раздел 8.2)

3) Сравнение двух строк символов определяется следующим образом:

        a) If the length in characters of X is not equal to the length
          in characters of Y, then the shorter string is effectively
          replaced, for the purposes of comparison, with a copy of
          itself that has been extended to the length of the longer
          string by concatenation on the right of one or more pad char-
          acters, where the pad character is chosen based on CS. If
          CS has the NO PAD attribute, then the pad character is an
          implementation-dependent character different from any char-
          acter in the character set of X and Y that collates less
          than any string under CS. Otherwise, the pad character is a
          <space>.

        b) The result of the comparison of X and Y is given by the col-
          lating sequence CS.

        c) Depending on the collating sequence, two strings may com-
          pare as equal even if they are of different lengths or con-
          tain different sequences of characters. When the operations
          MAX, MIN, DISTINCT, references to a grouping column, and the
          UNION, EXCEPT, and INTERSECT operators refer to character
          strings, the specific value selected by these operations from
          a set of such equal values is implementation-dependent.

Если это поведение должноИзбегайте, вы можете повернуть столбцы как часть вашего ИСКЛЮЧЕНИЯ:

SELECT 'TEST', REVERSE('TEST')
EXCEPT
SELECT 'TEST ', REVERSE('TEST ')

, который дает ожидаемый результат, хотя это довольно раздражает, особенно если вы имеете дело с несколькими столбцами.

В качестве альтернативы можно было бы найти последовательность сортировки с альтернативным символом пэда или набор опций без пэда, хотя, похоже, этого не существует в t-sql после быстрого поиска в Google.

В качестве альтернативы вы можете завершить каждый столбец символом, а затем вставить его в конец:

SELECT SUBSTRING(col,1,LEN(col -1)) FROM 
(
    SELECT 'TEST' + '^' as col
    EXCEPT 
    SELECT 'TEST ' + '^'
) results
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...