我正在編寫一個集成測試,它將一個複雜的order by
傳遞給PostgreSQL,然後檢查數據是否以正確的順序返回。我正在用Java編寫這個集成測試,它的String.compareTo
方法似乎與PostgreSQL有所不同。我跑這對我的PostgreSQL數據庫:我如何構建一個比較字符串的方式與PostgreSQL相同?
SELECT regexp_split_to_table('D d a A c b', ' ') ORDER BY 1;
它反應了這一點:
a
A
b
c
d
D
然後我創造了這個單元測試來比較的方式的Java排序的事情:
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import org.junit.Test;
import java.util.List;
import static junit.framework.Assert.assertEquals;
public class PostgresqlSortOrderTest {
@Test
public void whenJavaSortsStringsThenItIsTheSameAsWhenPostgresqlSortsStrings() {
List<String> postgresqlOrder = Lists.newArrayList("a", "A", "b", "c", "d", "D");
Ordering<String> ordering = new Ordering<String>() {
@Override
public int compare(String left, String right) {
return left.compareTo(right);
}
};
List<String> javaOrdering = ordering.sortedCopy(postgresqlOrder);
assertEquals(postgresqlOrder, javaOrdering);
}
}
此輸出失敗:
Expected :[a, A, b, c, d, D] //postgresql
Actual :[A, D, a, b, c, d] //java
我對這裏的術語一無所知。我想知道這些不同的字符串排序的名稱,所以我可以更好地溝通。但更重要的是,我怎樣才能讓PostgreSQL像Java那樣排序呢?
Java以ASCII碼順序執行。 PG似乎按字母順序排列,同一字母的小寫和大寫順序排列(低於<上部)。這足以寫入比較器。 –
@DaveNewton是真的,但如果有一個庫已經有了這樣一個比較器,我寧願使用它,而不是寫我自己的。你知道嗎? –
Yep,String.CASE_INSENSITIVE_ORDER,在標準API中。 –