2012-02-13 18 views
31

Tôi có bảng có dữ liệu 1/1 đến 1/20 trong một cột. Tôi muốn giá trị 1 đến 20 nghĩa là sau khi '/' (dấu gạch chéo trước) được cập nhật vào cột khác trong cùng một bảng trong SQL Server.Cách chia chuỗi sau ký tự cụ thể trong SQL Server và cập nhật giá trị này thành cột cụ thể

Ví dụ:

Cột có giá trị 1/1,1/2,1/3...1/20
giá trị cột mới 1,2,3,..20

tức là Tôi muốn cập nhật cột mới này

Cảm ơn trước ...!

Trả lời

70

Hãy thử điều này:

UPDATE YourTable 
SET Col2 = RIGHT(Col1,LEN(Col1)-CHARINDEX('/',Col1)) 
+0

ý tưởng tuyệt vời để kết hợp 'charindex' với' right' - nó cũng hoạt động với 'left', thực sự tuyệt vời :) –

+1

Chỉ cần bản thân mình, và nó cũng hoạt động trong DB2 nếu bạn phụ' LEN' với 'LENGTH' và' CHARINDEX' với 'LOCATE' –

1

Có lẽ một cái gì đó như thế này:

Đầu tiên một số dữ liệu thử nghiệm:

DECLARE @tbl TABLE(Column1 VARCHAR(100)) 

INSERT INTO @tbl 
SELECT '1/1' UNION ALL 
SELECT '1/20' UNION ALL 
SELECT '1/2' 

Sau đó như thế này:

SELECT 
    SUBSTRING(tbl.Column1,CHARINDEX('/',tbl.Column1)+1,LEN(tbl.Column1)) 
FROM 
    @tbl AS tbl 
-1
SELECT emp.LoginID, emp.JobTitle, emp.BirthDate, emp.ModifiedDate , 
     CASE WHEN emp.JobTitle NOT LIKE '%Document Control%' THEN emp.JobTitle 
      ELSE SUBSTRING(emp.JobTitle,CHARINDEX('Document Control',emp.JobTitle),LEN('Document Control')) 
     END 
     ,emp.gender,emp.MaritalStatus 
FROM HumanResources.Employee [emp] 
WHERE JobTitle LIKE '[C-F]%' 
+0

Bài đăng chỉ mã không khuyến khích ở đây. Có lẽ bạn nên bao gồm một lời giải thích. –

+0

không giải thích? và sử dụng tên cột không liên quan! –

-1

Sử dụng CHARINDEX. Có lẽ làm cho chức năng của người dùng. Nếu bạn thường xuyên sử dụng phần này.
tôi sẽ tạo ra chức năng này:

CREATE FUNCTION [dbo].[Split] 
(
    @String VARCHAR(max), 
    @Delimiter varCHAR(1) 
) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH Split(stpos,endpos) 
    AS(
     SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos 
     UNION ALL 
     SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1) 
      FROM Split 
      WHERE endpos > 0 
    ) 
    SELECT 'INT_COLUMN' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)), 
     'STRING_COLUMN' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos) 
    FROM Split 
) 
GO 
+0

Vui lòng xây dựng. Câu trả lời của bạn là mơ hồ. – mzedeler

-1

Từ: http://www.sql-server-helper.com/error-messages/msg-536.aspx

Để sử dụng chức năng bên trái nếu không phải tất cả dữ liệu ở dạng '1/12' bạn cần điều này trong dòng thứ hai trên:

Set Col2 = LEFT(Col1, ISNULL(NULLIF(CHARINDEX('/', Col1) - 1, -1), LEN(Col1))) 
+0

Cảm ơn Soner Gönül! – Miguel

+0

Tôi đoán một số người không hiểu ý tôi. Dữ liệu của bạn: 1/1; 1/2; 2/1; 2/2; 2/3; 3; 4/1; Bạn có thể gặp lỗi trong "3" do thiếu phụ. – Miguel

6

Vui lòng tìm truy vấn bên dưới cũng chia chuỗi bằng dấu phân cách.

Select Substring(@String1,0,CharIndex(@delimeter,@String1)) 
-1
SELECT SUBSTRING(ParentBGBU,0,CHARINDEX('-',ParentBGBU,0)) FROM dbo.tblHCMMaster; 
+0

có thể không hữu ích cho câu hỏi này nhưng câu trả lời này tiết kiệm 1 giờ googling của tôi.nó cho tôi kết quả mong đợi của tôi là 'A5/LS/CHMB/17-18/WAI' sẽ là' A5' –

0

Tôi biết câu hỏi này là cụ thể cho máy chủ SQL, nhưng tôi đang sử dụng postgresql và đã xem qua câu hỏi này, vì vậy đối với bất kỳ ai khác trong một tình huống tương tự, đó là split_part(string text, delimiter text, field int) chức năng.

Các vấn đề liên quan