2016-01-26 5 views
0

Мне нужно связать различные таблицы, каждый из которых имеет общий ключ (серийный номер в этом случае). В некоторых таблицах ключ имеет начальный нуль, например. '037443', а на других - нет. '37443'. В обоих случаях серийный номер относится к одному и тому же продукту. Чтобы помешать вещам серийные номера, не всегда являются числовыми, например. может быть «BDO1234», в этих случаях никогда не будет начального нуля.T-SQL Присоединиться к внешнему ключу с нулевым

Я бы предпочел использовать инструкцию WHERE (WHERE a.key = b.key), но при необходимости мог бы использовать объединения. Есть какой-либо способ сделать это?

Я все еще учусь, поэтому, пожалуйста, держите его простым, если это возможно. Большое спасибо.

+0

[Это] (http://stackoverflow.com/ вопросы/662383/better-methods-for-trimming-leading-zeros-in-sql-server) не является ответом на ваш вопрос, но должен вести вас в правильном направлении. –

+0

Спасибо, что побудило меня обновить мой пост, потому что это не так уж просто, сериалы когда-то были буквенными, поэтому мне нужно сбросить нуль, только если он существует, если это имеет смысл? – Absinthe

ответ

2

На основании принятого ответа в этом link, я написал небольшой образец TSQL, чтобы показать вам, что я имел в виду под «правильном направлении»:

Создать тестовую таблицу:

CREATE TABLE tblTempTest 
(
    keyCol varchar(20) 
) 
GO 

заполнит его:

INSERT INTO tblTempTest VALUES 
('1234'), (''), ('10234'), ('0k234'), ('k2304'), ('00034') 

Выберите значения:

SELECT keyCol, 
     SUBSTRING(keyCol, PATINDEX('%[^0]%', keyCol + '.'), LEN(keyCol)) As trimmed 
FROM tblTempTest 

Результаты:

keyCol    trimmed 
-------------------- -------------------- 
1234     1234 

10234    10234 
0k234    k234 
k2304    k2304 
00034    34 

Очистка:

DROP TABLE tblTempTest 

Обратите внимание, что значения являются буквенно-цифровой, и только нули обрезаются.
Одним из возможных недостатком является то, что если есть 0 после пустого пространства не будет урезан, но это легко исправить - просто добавьте ltrim:

SUBSTRING(LTRIM(keyCol), PATINDEX('%[^0]%', LTRIM(keyCol + '.')), LEN(keyCol)) As trimmed 
+0

Получил, спасибо большое – Absinthe

+0

Рад помочь :-) –

1

Вам нужно создать функцию

CREATE FUNCTION CompareSerialNumbers(@SerialA varchar(max), @SerialB varchar(max)) 
RETURNS bit 

AS 

BEGIN 
    DECLARE @ReturnValue AS bit 
    IF (ISNUMERIC(@SerialA) = 1 AND ISNUMERIC(@SerialB) = 1)  
    SELECT @ReturnValue = 
     CASE 
      WHEN CAST(@SerialA AS int) = CAST(@SerialB AS int) THEN 1 
      ELSE 0 
     END 
    ELSE 
     SELECT @ReturnValue = 
     CASE 
      WHEN @SerialA = @SerialB THEN 1 
      ELSE 0 
    END 
    RETURN @ReturnValue 
END; 
GO 

Если оба являются числовыми, то он сравнивает их как целые числа, в противном случае он сравнивает их как строки.

+0

Спасибо, но они также могут быть буквенно-цифровыми. Могу ли я проверить для int каким-то образом, затем использовать, затем использовать оператор CASE для преобразования if true? – Absinthe

+0

Ответ заменен на функцию для проверки для обоих типов –

+0

Спасибо, один для набора инструментов :) – Absinthe

Смежные вопросы