2016-05-06 2 views
1

У меня есть этот запрос,Удаление вкладки пространства в SQL Server 2012

INNER JOIN view AS vw ON vw.[Id] = vw2.[Id] 

Проблема является возвращение в vw2. [Id] содержит табуляции в конце ('2012 „) и VW не (“ 2012'). Поэтому я пробовал делать

INNER JOIN view AS vw ON vw.[Id] = Replace(vw2.[Id], char(9), '') 

К сожалению, сравнение по-прежнему возвращает false. Я думал, что это невозможно сделать при подключении, поэтому я попробовал его по выбранному запросу

SELECT * 
FROM database.view2 
WHERE REPLACE(Id, char(9), '') = '2012 ' 

Но этот запрос также возвращает false. Может кто-нибудь объяснить мне, какую концепцию я упускаю или недопонимаю?

EDIT

Здравствуйте и спасибо всем, кто принял свое время, чтобы помочь мне в этом. Кажется, что

vw.[Id] = LTRIM(RTRIM(REPLACE(vw2.[Id], char(9), '') 

сделал трюк. Я продолжаю использовать REPLACE на обоих концах, что является результатом очень длительного времени запроса, которое не является необходимым. Я использовал LTRIM и RTRIM также для получения данных, но с момента возврата varbinary он не нужен, и я не понимаю, что я делаю неправильно. Но сейчас он работает, спасибо всем.

+0

Какие типы данных являются двумя идентификаторами, хранящимися как? – Sturgus

+0

Привет @Sturgus оба находятся в nvarchar –

+0

Что является результатом 'select vw2. [Id], cast (vw2. [Id] как varbinary (max))' для значения, которое, по вашему мнению, заканчивается на одной вкладке? –

ответ

2

Я подозреваю, что может быть больше персонажей, с которыми вы имеете дело, чем просто вкладка. Например, вы включаете REPLACE(Id, char(9), '') = '2012 ' Почему в конце есть место на месте после замены?

Мне удалось заставить ваш метод работать в SQL 2008R2, так что ниже приведен код с доказательством концепции.

CREATE TABLE #table1 (
Id varchar(5) 
) 

CREATE TABLE #table2 (
Id varchar(5) 
) 

INSERT INTO #table1 
VALUES 
('2012') 
,('2013') 
,('2014') 
,('2015') 
,('2016') 

INSERT INTO #table2 
VALUES 
('2012'+CHAR(9)) 
,('2013'+CHAR(9)) 
,('2014'+CHAR(9)) 
,('2015'+CHAR(9)) 
,('2016'+CHAR(9)) 

SELECT t1.Id, t2.Id 
FROM #table1 t1 
INNER JOIN #table2 t2 
    ON t1.Id = REPLACE(t2.Id,CHAR(9),'') 

Посмотрите, дает ли это правильные результаты - это для меня.

+0

Привет, спасибо за это. Но вы пытались вставить «вкладку» в строку вместо + CHAR (9)? Если это тоже работает, возможно, это потому, что я использую nvarchar? –

+0

Less- чем тщательное тестирование символов char и nchar, а также фактическое использование вкладки внутри строки, также показывает правильные результаты. – Forrest

+0

Благодарим вас за то, что вы не торопитесь. Я очень благодарен. Тогда, если это так, это разочаровывает. Должен ли я перезапустить свой sql ? lol –

1

Ваша логика кажется правильной. Вы пробовали:

INNER JOIN view AS vw ON vw.[Id] = RTRIM(vw2.[Id]) 

?

Вы также можете комбинировать триммеры и заменять их как способ избавиться от всех пробелов. Хотя, кажется, что с помощью кувалды, чтобы получить то, что вы хотите ...

INNER JOIN view AS vw ON REPLACE(LTRIM(RTRIM(vw.[Id]), char(9), '') = REPLACE(LTRIM(RTRIM(vw2.[Id]), char(9), '') 
+0

Уже пробовал этот, не работал. Я знаю, что это должно быть просто, но я не знаю, почему он не работает: \ –

+0

Hm ... если приведенное выше изменение не работает, я думаю, вам придется проверять ваши значения в обоих идентификаторах немного ближе. Он должен выполнять эту работу. – Sturgus

+0

Я попытался его отливки в VARBINARY (макс), чтобы показать разницу в двух, и это является результатом 0x4F00500045002D003000300030003500340039003300320036003800 0x4F00500045002D0030003000300035003400390033003200360038000900 кажется, что вкладка единственное различие, но я не понимаю, почему он не работает –

1

Попробуйте это:

INNER JOIN вид AS Vw НА LTRIM (RTRIM (оч.сл. [Id]).) = LTRIM (rtrim (vw2. [Id]))

+0

Yup, уже пробовал этот, но он не работает –

+0

INNER JOIN view AS vw ON ltrim (rtrim (заменить (vw. [Id], char (9), ''))) = ltrim (rtrim (replace (vw2. [Id], char (9), '')) – Safford96

+0

Я не думаю, что это хорошая практика, так как запрос работает в течение 5 минут и все еще нет результата, в котором оригинал занимает всего около 10 секунд –

1

Это не дает ответа на исходный вопрос, но он может функционировать в качестве обходного:

INNER JOIN view AS vw ON CONVERT(integer, vw.[Id]) = CONVERT(integer, vw2.[Id]) 

Если все идентификаторы являются целыми числами типа (как ваш «2012» пример).

+0

Привет @Sturgus В качестве примера я использовал только 2012, но Id - это комбинация String-Int, поэтому я использую nvarchar. Извините за недопонимание. –

+0

Darn. Вернуться к доске для рисования. – Sturgus