sqlite에서 패딩으로 문자열을 연결하는 방법


214

sqlite 테이블에 세 개의 열이 있습니다.

    Column1    Column2    Column3
    A          1          1
    A          1          2
    A          12         2
    C          13         2
    B          11         2

선택해야합니다 Column1-Column2-Column3(예 :) A-01-0001. 각 열을 패드로 채우고 싶습니다.-

나는 SQLite와 관련하여 초보자이며 도움을 주시면 감사하겠습니다.


답변:


383

||연산자 "CONCATENATE"- 그것은 함께 피연산자의 두 문자열을 결합한다.

에서 http://www.sqlite.org/lang_expr.html

패딩의 경우, 내가 사용한 것처럼 보이는 사기적인 방법은 대상 문자열로 시작하여 '0000'이라고 말하고 '0000423'을 연결 한 다음 '0423'에 대해 substr (result, -4, 4)하는 것입니다.

업데이트 : SQLite에 "lpad"또는 "rpad"의 기본 구현이없는 것처럼 보이지만 여기에서 기본적으로 제안한 내용을 따를 수 있습니다. http://verysimple.com/2010/01/12/sqlite-lpad -rpad 기능 /

-- the statement below is almost the same as
-- select lpad(mycolumn,'0',10) from mytable

select substr('0000000000' || mycolumn, -10, 10) from mytable

-- the statement below is almost the same as
-- select rpad(mycolumn,'0',10) from mytable

select substr(mycolumn || '0000000000', 1, 10) from mytable

그 모습은 다음과 같습니다.

SELECT col1 || '-' || substr('00'||col2, -2, 2) || '-' || substr('0000'||col3, -4, 4)

그것은 산출

"A-01-0001"
"A-01-0002"
"A-12-0002"
"C-13-0002"
"B-11-0002"

9
@Andrew-일반적으로 NULL을 포함하는 스칼라 연산은 NULL을 생성합니다. 를 사용하여 요구 사항을 충족 할 수 있습니다 COALESCE(nullable_field, '') || COALESCE(another_nullable_field, '').
MatBailie

37

SQLite에는printf 정확히 다음과 같은 기능 이 있습니다.

SELECT printf('%s-%.2d-%.4d', col1, col2, col3) FROM mytable

1
쿼리 오류 : 해당 기능 없음 : printf mytable limit 7에서 select printf ( '% s. % s', id, url) 문을 실행할 수 없습니다. 내 버전은 3.8.2 2014-12-06입니다. 어떤 버전을 사용하고 있습니까?
Berry Tsakala

5
@BerryTsakala : 3.8.6
Yakov Galka

1
3.8.3 "그리고 printf () SQL 함수의 추가와 같은 다른 사소한 개선이 있습니다."
Sandburg

17

@tofutim 답변에 한 줄만 더 ... 연결 된 행에 대한 사용자 정의 필드 이름을 원하면 ...

SELECT 
  (
    col1 || '-' || SUBSTR('00' || col2, -2, 2) | '-' || SUBSTR('0000' || col3, -4, 4)
  ) AS my_column 
FROM
  mytable;

SQLite 3.8.8.3 에서 테스트되었습니다 . 감사합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.