4

db テーブルに英数字の列があります。私のフィルターでは、結果フィルター値を取得するために between を使用していました。すべてが大丈夫です。ただし、場合によっては、フィルタリングによって一部のデータが失われることがあります。ここに私のサンプルがあります、

サンプルデータ

ACQPO14
002421
ACQPO8
ACQPO14
ACQPO19
DUMMY0001

SQL クエリ

SELECT po.No,
   po.PoS
FROM PoDetails pod
INNER JOIN Pors po ON po.Id=PoD.PoId
WHERE po.No BETWEEN 'ACQPO1' AND 'ACQPO20'

上記のサンプルの場合。クエリはACQPO14ACQPO19 NOT ACQPO8のみを返します。

この問題への助けをいただければ幸いです。

ありがとう

4

5 に答える 5

1

文字だけなので分かりやすいです。

1が前に来る8と、テキストを (左から右に) 並べると、データベースは の最後の桁を無視しACQPO14て と比較しACQPO8ます。したがって、 ACQPO1(4削除済み) が前に来てACQPO8ACQPO2(0削除済み) も前に来ACQPO8ます。したがって、 によって除外されますbetween

これを修正する唯一の方法は、列を分割して解析することです。EG:ACQPOが固定長のプレフィックスの場合、DBMS 関数 (何も指定していない) を使用してその部分をトリミングし、残りを数値形式に変換できます。次に、その数値の剰余で比較/フィルタリングします。

于 2013-10-11T04:59:16.197 に答える
0

ACQPO が修正されている場合は、SQL Server で以下を試してください

SELECT po.No, po.PoS
FROM PoDetails pod
INNER JOIN Pors po ON po.Id=PoD.PoId
WHERE left(po.No,5) and 
cast(substring(po.No,6,len(po.No)) as int)
BETWEEN cast(substring('ACQPO1',6,len(po.No)) as int)  AND cast(substring('ACQPO20',6,len(po.No)) as int)


SELECT substring(data,6,len(data)),* FROM #Temp Where 
left(data,5) ='ACQPO' And 
cast(substring(data,6,len(data)) as int)
BETWEEN cast(substring('ACQPO1',6,len(data)) as int)  AND cast(substring('ACQPO20',6,len(data)) as int)
于 2013-10-11T05:08:46.520 に答える
0

MYSQL の場合:-

SELECT * FROM my_table WHERE SUBSTR(seq_num, 1,3) = 'ABC' /* プレフィックス コードの確認 */ AND REPLACE(seq_num, 'ABC', '') >= 61440 AND REPLACE(seq_num, 'ABC', '' ) <= 61807

また

SELECT * FROM my_table WHERE SUBSTR(seq_num, 1,3) = 'ABC' /* プレフィックス コードの確認 */ AND substr(seq_num, 4, length(seq_num)) >= 61440 AND SUBSTR(seq_num, 4, LENGTH(seq_num) ) <= 61807

(のような) の作品:

ABC61447、ABC61448、ABC61545、...、...、ABC61807

于 2021-04-29T19:16:26.677 に答える