【解決方法】like演算子を使用せずに文字列連結値をint値と比較してSQLでデータを取得する方法


I have table data like below

Id | StringValue 
== | ============= 
1  | 4,50  
2  | 90,40

I will get input StringValue like 4. I need to fetch the data exact matched record. When i am using like operator, select query giving two rows but i need exact matched data record only.

can anybody please help me on this?

What I have tried:

SELECT * FROM Table1 where StringValue like '%4%'

but it returns two rows both ID 1 and 2.

My expectation is I need to get ID = 1 row only

解決策 1

さて、文字列を分割して数値を保存するのではなく、文字列を保存するという間違いを犯したため、SQL で文字列を次のように分割する必要があります。 STRING_SPLIT[^]、次に、その返された配列で探している値を探します。

これに関する問題は、値の結果を検索できるように、クエリで STRING_SPLIT ON EVERY ROW IN THE TABLE を実行する必要があることです。 テーブルに多数のレコードがある場合、これにはかなりの時間がかかります。

このデータを表現する方法を再考し、SQL の長所を活用するテーブルとリレーションに分割することを強くお勧めします。

解決策 2

デイブが言ったことに追加するには…

LIKE 演算子は文字列でのみ機能します。そのため、間違いを修正して数字を数値列に格納したとしても (これは実際に行う必要があります)、SWL はそれらを文字列に変換して LIKE 比較を行います。

しかし、それでも、数値 4.5 と 4 を比較して「これらは同一である」という結果を与える組み込みの演算子はありません。
あなたの選択 (DB 設計が修正された後) は、以下を使用して数値を整数に変換することです。 SQL Server CAST() 関数[^] 小数部分を破棄するか、範囲を使用します。

SQL
...WHERE x BETWEEN 4.0 AND 4.99999

ただし、最初に DB を変更する必要があります。ストレージには常に適切なデータ型を使用してください。 数値フィールドの数値 (INT、FLOAT、DECIMAL)。 日付ベースの列の日付 (DATE、DATETIME、DATETIME2)。 また、それらと連携するようにプレゼンテーション ソフトウェアを変更する必要があります。つまり、変換された値をパラメーターとして渡して DB を INSERT または UPDATE する前に、入力を検証および変換する必要があります。

そうしないと、いくつかの重大な問題を抱えていることになります。無効なデータ、混合形式のデータ、SQL インジェクションが主な懸念事項です。

コメント

タイトルとURLをコピーしました