Làm cách nào để đặt các số 0 đứng đầu cho các số nhỏ hơn 10 mà không ảnh hưởng đến 10+ đó?


7

Có lẽ là một câu hỏi mới, nhưng ...

Tôi có một bảng có trường VARCHAR chứa các số từ 1 đến 300. Tôi cần đặt số 0 đứng trước bất kỳ số nào nhỏ hơn 10 trong khi vẫn giữ số gốc nếu nó là 10 hoặc lớn hơn (ví dụ 1 = 01, 10 = 10 và 300 = 300).

SELECT DISTINCT RIGHT('0'+CONVERT(VARCHAR,[FacilityCode]),3) FROM...

Điều này trả về 1 = 01, 10 = 010 và 300 = 300 (sử dụng các ví dụ tương tự như trên)

EDIT: Tôi đang cố gắng thực hiện điều này trong một truy vấn để tôi có thể thực hiện tra cứu mà không thay đổi một trong hai bảng.

Ai đó có thể giúp anh trai một tay ở đây? Bộ não của tôi không hoạt động.


Bất kỳ lý do cụ thể mà bạn không muốn 1trở thành 001?
RolandoMySQLDBA

RolandoMySQLDBA - Bảng có liên quan có các giá trị varchar theo ví dụ trên. Đánh dấu, tôi đang sử dụng MSSQL 2008 r2. Tất cả ... Tôi đang cố gắng thực hiện điều này thông qua một truy vấn để chọn các mục trong bảng có liên quan định dạng các số (thực sự là các biến số) theo cách minh họa ở trên.
SnagQueensHubby

Câu trả lời:


12

Cách an toàn nhất có lẽ là chỉ thêm số không khi độ dài của cột là 1 ký tự:

UPDATE
   Table
SET
   MyCol = '0' + MyCol
WHERE
   LEN(MyCol) = 1;

Điều này sẽ bao gồm tất cả các số dưới 10 và cũng bỏ qua bất kỳ số nào đã có số 0 đứng đầu.

BIÊN TẬP

Để chỉ chọn dữ liệu, hãy thử:

SELECT
   MyColPadded = CASE WHEN LEN(MyCol) = 1 THEN '0' + MyCol ELSE MyCol END
FROM
   MyTable;

1

.

Bất kỳ tùy chọn nào ở trên đều hoạt động tốt, tôi thường sử dụng RIGHT()tùy chọn "tiền tố 0 sau đó sử dụng tùy chọn như bạn có nhưng các tùy chọn khác hoàn toàn hợp lệ), nhưng một lời cảnh báo nếu bạn mong đợi các hàng mới (hoặc cập nhật cho các hàng hiện có) số thấp - nếu điều đó là có thể thì bạn sẽ kết thúc với các giá trị không được lưu lại. Để tránh điều này, bạn có thể sử dụng AFTERhoặc INSTEAD OFkích hoạt để buộc các giá trị vào đúng định dạng khi chúng được chèn / cập nhật để ngăn sự cố quay trở lại (không có cần thay đổi tất cả các điểm mã lưu vào bảng đó). Hãy cẩn thận để xác minh hiệu suất mặc dù: trình kích hoạt có thể rất mạnh nhưng cũng dễ tạo ra cơn ác mộng về hiệu năng với chúng.


1

Bạn có thể sử dụng một tuyên bố trường hợp cho điều này, nếu nó phải được định dạng trong cơ sở dữ liệu và bạn không thể tiếp tục nó.

Select case when len(facilityCode) = 1 then 
          '0' else '' end + facilityCode as facilityCode
From YourTable

Có vẻ như bạn đang làm điều này như một FK, nếu vậy bạn không thể có ràng buộc FK đối với một phép tính. Để làm cho việc tham gia dễ dàng hơn, bạn có thể xem xét một cột được tính toán.

 ALTER TABLE yourTable 
    ADD cFacilityCode AS (
      case when len(facilityCode) = 1 then '0' else '' end + facilityCode);

0

Nếu bạn muốn có một số có 3 chữ số hãy thử điều này.

SELECT DISTINCT 
RIGHT('000'+CAST(ISNULL([FacilityCode],0) AS VARCHAR),3) 
FROM...

Kết quả: 1 = 001, 10 = 010 và 300 = 300

Một số gồm 8 chữ số sẽ là:

SELECT DISTINCT 
RIGHT('00000000'+CAST(ISNULL([FacilityCode],0) AS VARCHAR),8) 
FROM...

Kết quả: 1 = 00000001, 10 = 00000010 và 300 = 00000300

Điều này có lợi thế khi làm việc với các truy vấn con:

SELECT t_lac.FORCE_OVERWRITE
            , ISNULL(lay.ID,0) AS lacIDLayout
            --, t_lac.lacName
            , CASE WHEN t_lac.lacIDControlType = 18
                THEN 'PAN' + RIGHT('000' + CAST(ISNULL((SELECT ID FROM Layout l WHERE l.layName = t_lac.lacName),0) AS VARCHAR),3) + '_' + t_lac.lacName
                ELSE t_lac.lacName
                END AS lacName
            , t_lac.lacIDControlType
            , t_lac.lacStyle 
            FROM @T_LayoutControl t_lac
            LEFT JOIN Layout lay ON lay.layName = t_lac.layName

-1
UPDATE MyTable
SET MyColumn = '0' + Mycolumn
WHERE MyColumn < '10'
AND MyColumn NOT LIKE '0%';

1
OP tuyên bố rằng giá trị tối thiểu là 1, nhưng nói chung, nếu bạn muốn có ít nhất hai chữ số và bạn có số 0, bạn muốn thêm một số 0 khác, vì vậy tôi sẽ sử dụng LEN(như trong câu trả lời của JNK) chứ không phải LIKE.
hvd

3
Logic đằng sau câu trả lời là lành mạnh nhưng câu trả lời không chính xác vì một lý do rất khác so với các ý kiến ​​trên. MyColumnlà một varchar, vì vậy tình trạng này MyColumn < '10'sẽ không dẫn đến TRUEkhi giá trị trong cột là '2'hay '3'hay ... '9'. Đối với các giá trị char '9' < '10'là sai.
ypercubeᵀᴹ

2
Đồng ý với @ypercube. Bạn có thể thay đổi so sánh đầu tiên thành MyColumn < 10nhưng điều đó có thể phá vỡ vì chúng tôi không biết liệu MyColumncó được đảm bảo chỉ bao gồm các số không.
Andriy M

-4
declare @num varchar(50) = '7'
select case when @num<100 
            then RIGHT('00'+ CONVERT(VARCHAR(50),@num),2) 
            else CONVERT(varchar(50),@num) end 

4
Chào mừng đến với trang web. Cùng với mã cố gắng viết ra một số tuyên bố để hiểu rõ hơn.
Md Haidar Ali Khan

Ngoài ra - tại sao sử dụng 100 làm điểm cắt, khi 10 sẽ là số tốt hơn - chỉ các giá trị từ 0 đến 9 mới có thêm 0.
RDFozz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.